按相同标准对不同元素进行排序

时间:2011-01-13 08:25:42

标签: xml xslt

我正在尝试对以下数据进行排序。

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

这只是简化的示例数据,但您明白了。它的两个不同的命名节点包含相同的结构。 现在我已经创建了两个不同的模板来处理内容和相关内容,但后来也进行了排序。是否有一种简单的方法可以对ID上的内容和相关内容进行排序?让我们说<text>包含一个文本。然后,我如何列出所有<text> - 内容元素和相关内容按ID排序?

谢谢!

2 个答案:

答案 0 :(得分:8)

尝试这样的事情

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

我想解决方案在于您使用union运算符//content

//relatedcontent|“加入”单个节点集

答案 1 :(得分:7)

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

<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>

应用于提供的XML文档(更正格式正确):

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

生成了正确排序的结果

<contents>
   Relatedcontent Here

   Content Here
 </contents>

请注意

  1. 不使用 <xsl:for-each>。仅使用<xsl:apply-templates>

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

  3. 如果将来要在id上排序的第三个元素添加到XML文档中,此转换仍然有效而不做任何更改。

    < / LI>