-2

重複の可能性:
xsltをコピーしてから、要素を変更して並べ替える

私はいくつかのxmlを持っています:

 <?xml version="1.0" encoding="utf-8"?>
<fruit namespace="basket">  
  <apple>
    <type>cox</type>
    <size>medium</size>
  </apple>  
  <orange>  
    <type>valencia</type>
    <size>large</size>
  </orange>  
</fruit>

より多くのフルーツインスタンスがあり、順序は何でもかまいません。xsltを使用したい:

  1. リンゴの要素を複製し、type要素を「cookingapple」に変更します。
  2. 次のビットの結果ツリーにその要素を追加します
  3. 新しく追加されたリンゴの要素を含むすべての果物をタイプ別に並べ替えます

私はそれが次のように見える必要があります

<?xml version="1.0" encoding="utf-8"?>
<fruit namespace="basket">  
  <apple>
    <type>cooking</type>
    <size>large</size>
  </apple>  
  <apple>
    <type>cox</type>
    <size>medium</size>
  </apple>  
  <orange>  
    <type>valencia</type>
    <size>large</size>
  </orange>  
</fruit>

誰かがxsltがこれをどのように望んでいるかを教えてもらえますか?

4

1 に答える 1

0

XSLT 2.0 を使用している場合、または EXSLT の使用が許可されている場合exslt:node-setは、この方法をお勧めします。

このように、追加するノードを含む変数を宣言します

<xsl:variable name="fruit">
  <apple>
    <type>cooking</type>
    <size>large</size>
  </apple>
</xsl:variable>

このようexslt:node-set()に、並べ替えられた既存のノードと一緒に使用します<xsl:for-each>

<xsl:template match="/*">
  <xsl:copy>
    <xsl:copy-of select="@*" />
    <xsl:for-each select="*|exslt:node-set($fruit)">
      <xsl:sort select="type" />
      <xsl:copy-of select="current()" />        
    </xsl:for-each>
  </xsl:copy>
</xsl:template>

XSLT 2.0 を使用している場合はexslt:node-set()、変数の周りから呼び出しを削除できます。exclude-result-prefixes="exslt"それ以外の場合は、出力をきれいに保つために使用することを忘れないでください!

于 2012-05-27T01:22:27.093 に答える