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フィールドに従って並べ替えたいと思います。タグを反復処理する方法を属性に注釈を付けました(ここではわかりやすくするため)。@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 に答える