2011-08-15 24 views
0

私はXMLに悩まされています.xsltを変換する必要があります。xsltで前のタグの情報を取得します。

は、ここに私のXML

<Groups> 
      <term> 
       <Tag1>My system1</Tag1> 
       <Tag2>yes</Tag2> 
       <Tag3>new york</Tag3> 
      </term> 
      <term> 
       <Tag1/> 
       <Tag2>no</Tag2> 
       <Tag3>chicago</Tag3> 
      </term>  
      <term> 
       <Tag1>My system2</Tag1> 
       <Tag2>ok</Tag2> 
       <Tag3>paris</Tag3> 
      </term> 
      <term> 
       <Tag1/> 
       <Tag2>help</Tag2> 
       <Tag3>london</Tag3> 
      </term> 
      <term> 
       <Tag1/> 
       <Tag2>cancel</Tag2> 
       <Tag3>rome</Tag3> 
      </term> 
</Groups> 

そして、ここで私の所望の出力です。

<Groups> 
      <term> 
       <Tag1>My system1</Tag1> 
       <Tag2>yes</Tag2> 
       <Tag3>new york</Tag3> 
      </term> 
      <term> 
       <Tag1>My system1</Tag1> 
       <Tag2>no</Tag2> 
       <Tag3>chicago</Tag3> 
      </term> 
      <term> 
       <Tag1>My system2</Tag1> 
       <Tag2>ok</Tag2> 
       <Tag3>paris</Tag3> 
      </term> 
      <term> 
       <Tag1>My system2</Tag1> 
       <Tag2>help</Tag2> 
       <Tag3>london</Tag3> 
      </term> 
      <term> 
       <Tag1>My system2</Tag1> 
       <Tag2>cancel</Tag2> 
       <Tag3>rome</Tag3> 
      </term> 
</Groups> 

すべてのxsltは、空のタグに前の空でないタグの値を入力する必要があります。

私は変数を使用しようとしましたが、明らかに命令型言語の変数のようには動作しません。

これを行う方法に関するアドバイスはありますか?あなたはいつもは、例えば、値を含まれないことに対応するタグを検索するには「前の」軸を使用することができます

おかげ

答えて

2

このシンプルなスタイルシートは、それを実行する必要がありますについては、ヘルプのための

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="*[not(text())]"> 
    <xsl:copy> 
     <xsl:value-of select="../preceding-sibling::*[*[text() and name()=name(current())]][1]/*[text() and name()=name(current())]" /> 
    </xsl:copy> 
    </xsl:template> 

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

感謝例、それは多くの助け:) – Nicolas

1

preceding::Tag1[text()] [1]。 (テキストの子を持つ最初のTag1要素を選択します。先行する軸の方向が文書の逆順であるため、最初のタグは前の非空のタグになります)。クリア?

+0

おかげで、私はupvoteなあ:( – Nicolas

+0

大丈夫だ、私が代わりに他の回答とupvoteの優雅にお辞儀:) –

関連する問題