5

次の XML ドキュメントがあります。

<?xml version="1.0" encoding="UTF-8"?>
<objects>
    <object>Clutch</object>
    <object>Gearbox</object>
    <object>Cylinder head</object>
    <object>Starter</object>
    <object>Airbox</object>
    <object>Inlet manifold</object>
</objects>

そして、次の XSLT ドキュメント:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="objects">
        <parts>
            <xsl:apply-templates>
                <xsl:sort select="object"/>
            </xsl:apply-templates>
        </parts>
    </xsl:template>

    <xsl:template match="object">
        <part>
            <xsl:apply-templates/>
        </part>
    </xsl:template>

</xsl:stylesheet>

適用すると、期待どおりに次の出力が得られますが、ソートされていません。

<?xml version="1.0" encoding="UTF-8"?>
<parts>
    <part>Clutch</part>
    <part>Gearbox</part>
    <part>Cylinder head</part>
    <part>Starter</part>
    <part>Airbox</part>
    <part>Inlet manifold</part>
</parts>

<xsl:sort select="object"/>が適用されないのはなぜですか?

4

1 に答える 1

8

その理由は次のとおりです。

      <parts>
          <xsl:apply-templates>
              <xsl:sort select="object"/>
          </xsl:apply-templates>
      </parts>

objectこれにより、現在のノード ( )の子 ( ) にテンプレートが適用され、最初の子objectsの文字列値で並べ替えられます。object

ただし、提供された XML ドキュメントでは、 には子がありobjectませんobject。つまり、それらはすべて同じソート キー (空の文字列) を持ち、ソート操作によって元の順序が変更されることはありません。

解決策:

        <parts>
            <xsl:apply-templates>
                <xsl:sort select="."/>
            </xsl:apply-templates>
        </parts>

完全な変換は次のようになります。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="objects">
    <parts>
     <xsl:apply-templates>
        <xsl:sort select="."/>
     </xsl:apply-templates>
    </parts>
 </xsl:template>

 <xsl:template match="object">
  <part>
     <xsl:apply-templates/>
  </part>
 </xsl:template>
</xsl:stylesheet>

提供された XML ドキュメントに適用されると、次のようになります。

<objects>
    <object>Clutch</object>
    <object>Gearbox</object>
    <object>Cylinder head</object>
    <object>Starter</object>
    <object>Airbox</object>
    <object>Inlet manifold</object>
</objects>

必要な正しい結果が生成されます。

<parts>
   <part>Airbox</part>
   <part>Clutch</part>
   <part>Cylinder head</part>
   <part>Gearbox</part>
   <part>Inlet manifold</part>
   <part>Starter</part>
</parts>
于 2012-07-17T13:00:51.353 に答える