Xml 按相同的条件对不同的元素进行排序

Xml 按相同的条件对不同的元素进行排序,xml,xslt,Xml,Xslt,我试图对以下数据进行排序 <contents> <content> <id> <text> </content> <relatedcontent> <id> <text> </relatedcontent> </contents> 这只是简单的示例数据,但您可以理解。它的两个不同的命名节点包含相同的结

我试图对以下数据进行排序

<contents>
   <content>
      <id>
      <text>
   </content>
   <relatedcontent>
      <id>
      <text>
   </relatedcontent>
</contents>

这只是简单的示例数据,但您可以理解。它的两个不同的命名节点包含相同的结构。 现在,我已经创建了两个不同的模板,分别处理内容和相关内容,但排序也分别完成。有没有一种简单的方法可以在ids上对内容和相关内容进行排序?假设
包含一个文本。然后,我如何列出按id排序的内容和相关内容的所有
-元素


谢谢

试试这样的东西

<xsl:foreach select="//content | //relatedcontent">
  <xsl:sort select="id" />
  <xsl:value-of select="text" />
</xsl:foreach>


我猜解决方案在于您使用union操作符将
//content
//relatedcontent
连接到单个节点集中

此转换显示了如何完成此操作:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*">
  <contents>
   <xsl:apply-templates>
    <xsl:sort select="id" data-type="number"/>
   </xsl:apply-templates>
  </contents>
 </xsl:template>

 <xsl:template match="content">
   Content Here
 </xsl:template>

 <xsl:template match="relatedcontent">
   Relatedcontent Here
 </xsl:template>
</xsl:stylesheet>
<contents>
   Relatedcontent Here

   Content Here
 </contents>

满足于此
相关内容在这里
应用于提供的XML文档时(更正为格式正确):


3.
2.
生成所需的正确排序结果

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*">
  <contents>
   <xsl:apply-templates>
    <xsl:sort select="id" data-type="number"/>
   </xsl:apply-templates>
  </contents>
 </xsl:template>

 <xsl:template match="content">
   Content Here
 </xsl:template>

 <xsl:template match="relatedcontent">
   Relatedcontent Here
 </xsl:template>
</xsl:stylesheet>
<contents>
   Relatedcontent Here

   Content Here
 </contents>

相关内容在这里
满足于此
注意事项

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*">
  <contents>
   <xsl:apply-templates>
    <xsl:sort select="id" data-type="number"/>
   </xsl:apply-templates>
  </contents>
 </xsl:template>

 <xsl:template match="content">
   Content Here
 </xsl:template>

 <xsl:template match="relatedcontent">
   Relatedcontent Here
 </xsl:template>
</xsl:stylesheet>
<contents>
   Relatedcontent Here

   Content Here
 </contents>
  • 不使用
    。仅使用

  • 不使用XPath联合运算符(是的,它被称为联合运算符,与管道无关)

  • 如果将来在XML文档中添加了第三个要根据
    id
    排序的元素,则此转换仍将有效,而不会发生任何更改


  • 谢谢我不是在使用foreach,我是在模板中使用它,但这也很好用!当模式已知时,使用带有起始
    /
    运算符的路径是不好的。@Alejandro:因为我对模式不太了解,所以我做了一个
    简单的
    示例。我认为就答案而言,这已经足够好了。+1是为了在一个更大的模板中简单易用。好问题,+1。有关更简单、更符合XSLT精神、更通用、更灵活的解决方案,请参见我的答案。:)从技术上说你是对的。但是我想XSL初学者在大多数情况下更容易使用
    。@Lucas Eder:对于某些类型的初学者来说,使用
    可能会更容易。然而,教初学者使用
    ,而不向他展示
    更强大、更通用——这显然是错误的。更不用说还有其他类型的初学者之前没有编程经验,这些人通常学习
    最自然。更不用说OP自己提到他没有使用
    呵呵“完全错误”。。。我喜欢这样。这部连环漫画里的是你吗?;-)说真的,快速浏览一下我们的大型web应用程序(60万用户,随时有2000多个并发会话)就会发现,大约有1263个循环。我想我们是你认为某种类型的初学者…但是在那里。感谢您的“通用”答案。@Lukas Eder:应用程序的大小通常与其开发人员的XSLT经验无关。我见过很多具有“初学者”XSLT质量的大型应用程序,因此您的事实并不令人惊讶。由于这些事实,我们更有义务向人们解释XSLT到底是什么。至于XKCD动画片,是的,这是一部很好的动画片,我已经知道很长时间了。不,我不是照片中的那个家伙,我不会告诉你怎么种萝卜。我不是一个“无所不知”的人,只是擅长一些事情,其他什么都不擅长。我可以接受。没有关于他们的噩梦1263对每个人来说…:-)