我有一组具有不同属性的元素,如下所示:
<?xml version="1.0" encoding=utf-8"?>
<root>
<elem at="4" iterate="third" />
<foo/>
<elem at="1" iterate="first" />
<bar/>
<elem start="3" end="9" iterate="second" />
</root>
我想迭代elem
代码,因此我像这样指定了for-each
:
<xsl:for-each select="/root/elem">
到目前为止一切顺利,但现在我想根据他们的@at
和@start
字段排序这些元素,而每个elem
都保证 @at
或 @start
。我在@iterate
属性中注释了我希望如何迭代标记(仅为了清楚起见)。
我的方法就是这个
<xsl:sort select="@at or @start" data-type="number" order="ascending" />
但这似乎并不像预期的那样有效,因为具有@at
属性的元素似乎优先于具有@start
属性的元素。
那么,我如何告诉XSLT(1.0)不要区分所设置属性的名称,只是根据其各自的值进行排序?
答案 0 :(得分:2)
你离我不远。尝试使用union运算符|
<xsl:sort select="@at|@start" data-type="number" order="ascending" />
这是完整的XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="root">
<root>
<xsl:apply-templates select="elem">
<xsl:sort select="@at|@start" data-type="number" order="ascending" />
</xsl:apply-templates>
</root>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
应用于XML时,输出以下内容
<root>
<elem at="1" iterate="first"></elem>
<elem start="3" end="9" iterate="second"></elem>
<elem at="4" iterate="third"></elem>
</root>