2011-02-06 10 views
1

プロ、私は以下の文書で「X」タグと「B」のタグを変換する必要が :XSLT - (任意のレベルで)XMLドキュメントのreoccuring部品を交換

<a> 
<B marker="true"> 
    <c> 
    <B marker="true"> 
     <d> 
     <B marker="true"> 
     </B> 
     <d> 
    </B> 
    </c> 
</B> 
</a> 

注再発する「B '、それは動的XMLの任意の深さに現れることができます。 は、ここに私がやったことだ:

<xsl:template match="//*[@marker='true']"> 
    <X> 
     <xsl:copy-of select="./node()"/> 
    </X> 
</xsl:template> 

これは、最上位の「B」タグのために働いたが、ネストされたすべてのものを無視しました。

私は問題が何であるかを知っていると思います。「コピー」は、一番上の「B」タグの内容を評価せずに単にフラッシュします。私のテンプレートを再評価するにはどうしたらよいですか?

ありがとうございます! Baruch。

+0

は、基本的な "アイデンティティtranform" パターンを利用し、私の答えを参照してください。 – Flack

答えて

7

私は恒等変換に行きます。

このコード:この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" indent="yes"/> 

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

    <xsl:template match="B[@marker = 'true']"> 
     <X> 
      <xsl:apply-templates/> 
     </X> 
    </xsl:template> 
</xsl:stylesheet> 

<a> 
    <B marker="true"> 
     <c test="test"> 
      testText 
      <B marker="true"> 
       <d> 
        testText2 
        <B marker="true"> 
         testText3 
        </B> 
       </d> 
      </B> 
      testText4 
     </c> 
     testText5 
    </B> 
</a> 

この正しい結果を提供します:

<a> 
    <X> 
     <c test="test"> 
      testText 
      <X> 
       <d> 
        testText2 
        <X> 
         testText3 
        </X> 
       </d></X> 
      testText4 
     </c> 
     testText5 
    </X> 
</a> 
+0

ありがとう!私はちょうどその解決策で自分自身に答える途中でした。しかし、それは名前を持っているか分からなかった:) – JBaruch

+0

「シングルトン」のようなカノニカルなものは好きではない。私はネイティブスピーカーでもないので、名前は変わることがあります。うれしいことです:) – Flack

+1

最初のテンプレートルールがIDトランスフォームを定義し、2番目のテンプレートルールがトランスフォームとIDトランスフォームとの違いを定義するという点で、「変更されたIDトランスフォーム」パターンと呼ばれる傾向があります。 –

関連する問題