0

我有一组具有不同属性的元素,如下所示:

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

到目前为止一切顺利,但现在我想根据它们的and字段对这些元素进行排序,而每个元素都保证or。我在属性中注释了我希望如何迭代标签(只是为了清楚起见)。@at@startelem @at @start@iterate

我的方法是这样的

<xsl:sort select="@at or @start" data-type="number" order="ascending" />

但这似乎并没有按预期工作,因为具有@at属性的元素似乎优先于具有@start属性的元素。

那么,我怎样才能告诉 XSLT (1.0) 不要区分设置的属性的名称,而只是根据其各自的值进行排序呢?

4

1 回答 1

2

你不远了。尝试使用联合运算符 |

<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>
于 2012-04-13T13:54:34.313 回答