2012-02-28 7 views
1

私は、ツリー内の同じ名前のノードでノードを置き換える方法を見つけようとしています。たとえば、次の入力で:私は、任意の数のノードを交換できるようにする必要があり、私も欲しいXSLT 2.0:孫ノードを持つノードをオーバーライドする

<root> 
    <foo> 
     <a>100</a> 
     <b>2</b> 
     <c>5000</c> 
    </foo> 
</root> 

<root> 
    <foo> 
     <a>1</a> 
     <b>2</b> 
     <c>3</c> 
     <bar> 
      <a>100</a> 
      <c>5000</c> 
     </bar> 
    </foo> 
</root> 

私はこのような何かを生成したいのですが物事が将来変化する可能性があるため、すべての可能性を綴るのではなく、リストを動的に把握することです。他の要件の1つは、親ノードの順序が元のままでなければならないということです。 (具体的には、私の最終的な出力はCSVファイルになり、列はヘッダーと整列する必要があります)

これは私のXSLT学習の最初の試みであり、私は完全にこの1つに困惑しています!どんな助けでも大歓迎です。私はXSLT 2.0を使用しています。

おかげで、 マーク

答えて

0

私はフォーマットされたコードをインデントしない厄介なSOバグを謝罪!

彼らは

...ヶ月間、この変換をこの問題を解決することはできません。

<root> 
    <foo> 
     <a>1</a> 
     <b>2</b> 
     <c>3</c> 
     <bar> 
      <a>100</a> 
      <c>5000</c> 
     </bar> 
    </foo> 
</root> 

:提供されるXML文書に適用

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<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= 
"*[*] 
     [every $leaf in .//*[not(*)] 
     satisfies 
     name($leaf) = preceding::*/name() 
     ] 
"/> 

<xsl:template match= 
    "*[not(*) and name() = following::*/name()]"> 

    <xsl:sequence select= 
    "following::*[name() = name(current())][1]"/> 
</xsl:template> 
</xsl:stylesheet> 

欲しい、正しい結果をもたらす

<root> 
    <foo> 
     <a>100</a> 
     <b>2</b> 
     <c>5000</c> 
    </foo> 
</root> 
+0

聖なる牛!私は自分自身でそれを理解することができないためにとても悪い気がしません。それは魅力のように動作します。どうもありがとう! – donkey

+0

@donkey:どうぞよろしくお願いいたします。 –

関連する問題