1

次の XML があります。

<root>
  <nodeLevel1>
    <nodeType1>node type 1</nodeType1>
    <nodeType2><rank>3</rank></nodeType2>
    <nodeType2><rank>1</rank></nodeType2>
    <nodeType2><rank>4</rank></nodeType2>
    <nodeType2><rank>2</rank></nodeType2>
    <nodeType3>node type 3</nodeType3>
  </nodeLevel1>
</root>

次の XSLT を使用して、この XML を並べ替えます。

<?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" version="1.0" encoding="UTF-8" omit-xml-declaration="no" indent="yes" media-type="text/html"/>

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

      <xsl:template match="nodeLevel1">
          <xsl:copy>
            <xsl:apply-templates select="node()|@*">
              <xsl:sort select="rank" data-type="number" />
            </xsl:apply-templates>
          </xsl:copy>
      </xsl:template>

      </xsl:stylesheet>

結果は次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <nodeLevel1>
    <nodeType1>node type 1</nodeType1>
    <nodeType3>node type 3</nodeType3>
    <nodeType2>
        <rank>1</rank>
    </nodeType2>
    <nodeType2>
        <rank>2</rank>
    </nodeType2>
    <nodeType2>
        <rank>3</rank>
    </nodeType2>
    <nodeType2>
        <rank>4</rank>
    </nodeType2>
</nodeLevel1>
</root>

問題は、すべての「nodeType2」が XML の正しい位置にないことです。「nodeType2」の前にノード「nodeType1」を保持し、「nodeType2」の後にノード「nodeType3」を保持するにはどうすればよいですか。(ソリューションでは、要素名「nodeType1」または「nodeType3」を使用しないでください。これは、任意の名前に変更できるためです)

したがって、結果は次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <nodeLevel1>
    <nodeType1>node type 1</nodeType1>
    <nodeType2>
        <rank>1</rank>
    </nodeType2>
    <nodeType2>
        <rank>2</rank>
    </nodeType2>
    <nodeType2>
        <rank>3</rank>
    </nodeType2>
    <nodeType2>
        <rank>4</rank>
    </nodeType2>
    <nodeType3>node type 3</nodeType3>
</nodeLevel1>
</root>

ご協力いただきありがとうございます。

4

2 に答える 2

0

これを行う 1 つの方法は、最初のnodeType2要素に一致するテンプレートを用意することです。

<xsl:template match="nodeType2[1]">

この中で、すべての nodeType2 要素を選択して並べ替えます

<xsl:for-each select="self::*|following-sibling::nodeType2">
   <xsl:sort select="rank" data-type="number" />
    <!-- Copy element -->
    <xsl:call-template name="identity" />
 </xsl:for-each>

他に必要なのは、他のnodeType2要素が 2 回出力されるのを防ぐための別のテンプレートだけです。

<xsl:template match="nodeType2" />

ここに完全な XSLT があります

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output method="xml" version="1.0" encoding="UTF-8" omit-xml-declaration="no" indent="yes" media-type="text/html"/>

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

      <xsl:template match="nodeType2[1]">
          <xsl:for-each select="self::*|following-sibling::nodeType2">
              <xsl:sort select="rank" data-type="number" />
              <xsl:call-template name="identity" />
            </xsl:for-each>
      </xsl:template>

       <xsl:template match="nodeType2" />
 </xsl:stylesheet>

XML に適用すると、以下が出力されます。

<root>
   <nodeLevel1>
      <nodeType1>node type 1</nodeType1>
      <nodeType2>
         <rank>1</rank>
      </nodeType2>
      <nodeType2>
         <rank>2</rank>
      </nodeType2>
      <nodeType2>
         <rank>3</rank>
      </nodeType2>
      <nodeType2>
         <rank>4</rank>
      </nodeType2>
      <nodeType3>node type 3</nodeType3>
   </nodeLevel1>
</root>
于 2013-04-12T20:03:00.547 に答える