我正在尝试对以下数据进行排序。
<contents>
<content>
<id>
<text>
</content>
<relatedcontent>
<id>
<text>
</relatedcontent>
</contents>
这只是简化的示例数据,但您明白了。它的两个不同的命名节点包含相同的结构。
现在我已经创建了两个不同的模板来处理内容和相关内容,但后来也进行了排序。是否有一种简单的方法可以对ID上的内容和相关内容进行排序?让我们说<text>
包含一个文本。然后,我如何列出所有<text>
- 内容元素和相关内容按ID排序?
谢谢!
答案 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>
请注意:
不使用 <xsl:for-each>
。仅使用<xsl:apply-templates>
。
不使用XPath联合运算符(是的,它被称为联合运算符,与管道无关)。
如果将来要在id
上排序的第三个元素添加到XML文档中,此转换仍然有效而不做任何更改。