2

私がこれを持っていると仮定します:

<nodes>
<node>
    <number>1</number>
    <name>"ABC"</name>
    <comment>"blah"</comment>
</node>

<node>
    <number>2</number>
    <name>"DEF"</name>
    <comment>"blah blah"</comment>
</node>

<node>
    <number>3</number>
    <name>"XYZ"</name>
    <comment>"blah blah blah"</comment>
</node>
</nodes>

私はこれで終わりたいと思います:

<nodes>
<node>
    <number>3</number>
    <name>"XYZ"</name>
    <comment>"blah blah blah"</comment>
</node>

<node>
    <number>2</number>
    <name>"DEF"</name>
    <comment>"blah blah"</comment>
</node>

<node>
    <number>1</number>
    <name>"ABC"</name>
    <comment>"blah"</comment>
</node>
</nodes>
4

2 に答える 2

2

I.あなたの場合、解決策は次のように簡単です:

<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="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="/*">
  <nodes>
   <xsl:apply-templates select="node">
     <xsl:sort select="position()" data-type="number" order="descending"/>
   </xsl:apply-templates>
  </nodes>
 </xsl:template>
</xsl:stylesheet>

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

<nodes>
    <node>
        <number>1</number>
        <name>"ABC"</name>
        <comment>"blah"</comment>
    </node>
    <node>
        <number>2</number>
        <name>"DEF"</name>
        <comment>"blah blah"</comment>
    </node>
    <node>
        <number>3</number>
        <name>"XYZ"</name>
        <comment>"blah blah blah"</comment>
    </node>
</nodes>

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

<nodes>
   <node>
      <number>3</number>
      <name>"XYZ"</name>
      <comment>"blah blah blah"</comment>
   </node>
   <node>
      <number>2</number>
      <name>"DEF"</name>
      <comment>"blah blah"</comment>
   </node>
   <node>
      <number>1</number>
      <name>"ABC"</name>
      <comment>"blah"</comment>
   </node>
</nodes>

Ⅱ.すべてのノードが同じドキュメントに属しているノード セットのインプレースを逆にする:

ノードセットのノードを逆にして、ドキュメント内の他のすべてのノードを「そのまま」残したい場合、事態はさらに複雑になります。

この XML ドキュメントをナビゲートしてみましょう:

<nums>
  <num>01</num>
  <num>02</num>
  <num>03</num>
  <num>04</num>
  <num>05</num>
  <num>06</num>
  <num>07</num>
  <num>08</num>
  <num>09</num>
  <num>10</num>
</nums>

numこれから、奇数の値を持つ要素が同じ順序であるが、偶数の値を持つnum要素が逆の順序になるドキュメントを作成したいと考えています。結果は次のようになります。

<nums>
   <num>01</num>
   <num>10</num>
   <num>03</num>
   <num>08</num>
   <num>05</num>
   <num>06</num>
   <num>07</num>
   <num>04</num>
   <num>09</num>
   <num>02</num>
</nums>

必要な結果を生成する変換は次のとおりです。

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

 <xsl:variable name="vNodes" select="/*/*[. mod 2 = 0]"/>

 <xsl:variable name="vrtfReverse">
   <xsl:for-each select="$vNodes">
     <xsl:sort select="position()" data-type="number" order="descending"/>
     <xsl:copy-of select="."/>
   </xsl:for-each>
 </xsl:variable>

 <xsl:variable name="vReverse" select="ext:node-set($vrtfReverse)/*"/>

 <xsl:template match="node()|@*" name="identity">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="*/*">
  <xsl:choose>
   <xsl:when test="count(. | $vNodes) > count($vNodes)">
     <xsl:call-template name="identity"/>
   </xsl:when>
   <xsl:otherwise>
     <xsl:variable name="vPositionInNodeSet" select=
     "count($vNodes
             [count(.
                    | current()/preceding::node()
                    | current()/ancestor::node()
                    )
             =
              count(  current()/preceding::node()
                    | current()/ancestor::node()
                    )
             ]
            ) +1"/>

     <xsl:for-each select="$vReverse[position() = $vPositionInNodeSet]">
       <xsl:call-template name="identity"/>
     </xsl:for-each>
   </xsl:otherwise>
  </xsl:choose>
 </xsl:template>
</xsl:stylesheet>
于 2012-08-21T11:29:02.877 に答える
1

これは、「ノード」の下の「ノード」を逆にする単純な XSLT 1.0 スタイルシートです...

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

<xsl:template match="@*|node()">
 <xsl:copy>
  <xsl:apply-templates select="@*|node()" />
 </xsl:copy>
</xsl:template>

<xsl:template match="nodes">
 <xsl:copy>
  <xsl:apply-templates select="@*" />
  <xsl:apply-templates select="node()">
    <xsl:sort select="position()" data-type="number" order="descending" /> 
  </xsl:apply-templates>
 </xsl:copy>
</xsl:template>

</xsl:stylesheet>
于 2012-08-21T01:06:03.493 に答える