1

私はXSLTの基本に精通していますが、理解できない奇妙な状況に遭遇しました。ご不便をおかけして申し訳ございませんが、ご協力いただければ幸いです。

並べ替えられたBrand/Value /@NameとDocs/Value / @ Nameの連結に基づいて、Level_5ノードを並べ替えたいので、Level_5を並べ替えます

XML unsorted:
<Root att="x">
  <Level_1 Name="NEW Level">    
    <Level_2>      
      <Level_3 Name="nameLvl_3">        
        <Level_4>       
          <Level_5 Name="aa">
            <Brand>
              <Value Name="Text" Value="1" />
            </Brand>            
        <Docs>
              <Value Name="Pro" Value="2" />
              <Value Name="Numeric" Value="0.05" />
            </Docs>            
          </Level_5>              
          <Level_5 Name="aa">            
            <Text>
              <Val Id="1"/>
            </Text>
          </Level_5>
          <Level_5 Name="aa">
            <Brand>
              <Value Name="Text" Value="2" />
              <Value Name="Number" Value="1" />
              <Value Name="Long" Value="3" />
            </Brand>
          </Level_5>
        </Level_4>
      </Level_3>
    </Level_2>    
  </Level_1>
</Root>

連結を実行すると、 ""、LongNumberText、TextNumericProが作成され、期待される出力は次のようになります。

<Root att="x">
  <level_1 Name="NEW Level">    
    <level_2>      
      <Level_3 Name="nameLvl_3">        
        <Level_4>
          <Level_5 Name="aa">            
            <Text>
              <Val Id="1"/>
            </Text>
          </Level_5>
          <Level_5 Name="aa">
            <Brand>
          <Value Name="Long" Value="3" />
      <Value Name="Number" Value="1" />
              <Value Name="Text" Value="2" />             
            </Brand>
          </Level_5>
          <Level_5 Name="aa">
            <Brand>
              <Value Name="Text" Value="1" />
            </Brand>            
    <Docs>          
              <Value Name="Numeric" Value="0.05" />
              <Value Name="Pro" Value="2" />
            </Docs>            
          </Level_5>
        </Level_4>
      </Level_3>
    </Level_2>    
  </Level_1>
</Root>

/ Brand / Value / @ Nameの最初の要素でしか並べ替えることができませんが、BrandとDocs内の残りの属性をどのように連結するかわかりません。これはコードimuisngです。

<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="Level_3/Level_4/Level_5/Brand|Docs">
    <xsl:copy>
      <xsl:apply-templates>
        <xsl:sort select="@Name" data-type="text"/>
        <xsl:sort select="@Value" data-type="text"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

  <!--                                                    -->
  <xsl:template match="Level_2/Level_3/Level_4">
    <xsl:copy>  
      <xsl:apply-templates select="Level_5">
        <xsl:sort select="Brand|Docs/Value/@Name" data-type="text"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

しかし、私はそれがブランドまたはドキュメント内の最初の要素を並べ替えるだけです助けてください

4

1 に答える 1

0

XPath 1.0 式でこれを行う賢い方法があるかもしれませんが、私はそれを見ていません。より簡単な方法は、2 つのステップでデータを処理することです。

最初に、ほぼ同一の変換を実行するスタイルシートを作成します。入力はそのまま出力に書き戻されますが、各 Level_5 要素にソートキーを持つ属性を追加します。 make-sort-key モード。

次に、別のスタイルシートを作成し、sort-key 属性を使用して並べ替えを制御します (不要な場合は再度ドロップします)。

別のトピック: 一致パターンLevel_3/Level_4/Level_5/Brand | Docsは と同等ではありませんLevel_3/Level_4/Level_5/Brand | Level_3/Level_4/Level_5/Docs。後者の場合は、別の一致パターンが必要です。

于 2012-11-01T00:48:27.203 に答える