2016-06-17 5 views
-1

困難なXSLT変換で失われました。XSLT - オプションの要素を使用したXSLT変換で真の課題があります。

これは私の入力ファイルです:任意のブロック 'アイテムは' あり

<block> 
    <item> 
     <name>item1</name> 
     <place>place1</place> 
    </item> 

    <item> 
     <name>item2</name> 
     <comment>comment2</comment> 
     <place>place2</place> 
    </item> 

    <item> 
     <name>item3</name> 
     <stick>stick3</stick> 
     <place>place3</place> 
    </item> 
    ... 
</block> 

  • コメントはオプション
  • スティックで必須ですオプションです
  • 場所
  • ためは非常に重要である必須です(DTDファイルは、このXMLを検証します)!

私の問題:各項目要素について、私は要素スティックを挿入したい:

<stick>default</stick> 
  • スティックが存在する場合は、要素コメント後にする必要があり、この要素それ以降ノードの名前 else。
  • スティックが既に存在する場合、アイテム要素を変更する必要はありません。再開するに

、私の出力ファイルがなければならない:

<block> 
    <item> 
     <name>item1</name> 
     <stick>default</stick> 
     <place>place1</place> 
    </item> 

    <item> 
     <name>item2</name> 
     <comment>comment2</comment> 
     <stick>default</stick> 
     <place>place2</place> 
    </item> 

    <item> 
     <name>item3</name> 
     <stick>stick3</stick> 
     <place>place3</place> 
    </item> 
    ... 
</block> 

私はすでに

:-(任意のアイデアを期待どおりの結果を持っているXSLT変換の多くが、不可能を試してみました

よろしくお願いいたします。 Zido

答えて

1

だからこそ:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="item[not(stick)]/comment | item[not(stick or comment)]/name"> 
    <xsl:copy-of select="."/> 
    <stick>default</stick> 
</xsl:template> 

</xsl:stylesheet> 
+0

は非常にマイケルをありがとうございます。それは完全に動作します!もう一度、私はあまりにも複雑にしたいと思う。私は哲学 "テンプレート"を持っていません。実際にはとても基本的です。すべてありがとうございます。 – zido71

+0

PS:なぜ私の質問に否定的に投票した人がいるのか分かりません... – zido71

+0

@ zido71 - どちらも分かりませんので、私は投票を使って残高を救済しました。 –

関連する問題