2016-07-21 16 views
1

XLSをXMLからXMLへ変換する方法を学び始めました。これは初心者ですが、単一のXSLT反復であり、この特定の問題について何も見つけることができません。
は、ここで私が持っているものです:子ノードを親の兄弟の子ノードにコピー

ソースXML:

<data> 
<a/> 
<b> 
    <b1>ID#1</b1> 
    <b2> 
    <b2_1/> 
    </b2> 
</b> 
<c> 
    <b1>ID#1</b1> 
    <b2_2/> 
</c> 
<!-- b and c nodes keep repeating with the same structure for different b1 IDs --> 
</data> 

私は何をする必要があること特定の子ノードに<c>ノードからそのコンテンツを<b2_2>ノードを移動することです<b>ノード - 値に等しいb/b1の値を持ちます。
baciclyは、親ノードが同じ値の特定の要素を共有する場合、子ノードをそのCousinノードに移動します。

所望の結果:

<data> 
<a/> 
<b> 
    <b1>ID#1</b1> 
    <b2> 
    <b2_1/> 
    <b2_2/> 
    </b2> 
</b> 
</data> 

現在XSLT:このコードは、ジョブの一部がない

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

<xsl:template match="b"> 
    <xsl:variable name="id1" select="b1" /> 
    <xsl:copy> 
    <xsl:apply-templates select="@* | node()"/> 
    <xsl:apply-templates select="following-sibling::c[b1=$id1]/b2_2"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="c"/> 

- それはターゲット<b>ノードにターゲット<b2_2>ノードを移動し、一方冗長<c>ノードをクリーニングしてください。私は今何を得る

<data> 
<a/> 
<b> 
    <b1>ID#1</b1> 
    <b2> 
    <b2_1/> 
    </b2> 
    <b2_2/> 
</b> 
</data> 

私は2つのXSLTファイルを持つ2つのステップで所望の変換を作る方法を見ることができますが、解決策は簡単で、表面上にあるような気がします。ターゲットノードを想定されているサブノードに配置する方法を釘付けにすることはできないので、正しい方向に任意のヒントを理解することができます。

答えて

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="b2"> 
    <xsl:copy> 
     <xsl:apply-templates/> 
     <xsl:copy-of select="../following-sibling::c[1]/b2_2"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="c"/> 

</xsl:stylesheet> 

それとも、あなたはb1値によってリンクすることを好む場合:

<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="*"/> 

<xsl:key name="c" match="c" use="b1" /> 

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

<xsl:template match="b2"> 
    <xsl:copy> 
     <xsl:apply-templates/> 
     <xsl:copy-of select="key('c', ../b1)/b2_2"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="c"/> 

</xsl:stylesheet> 
+0

は、このような迅速な答えをありがとう!あなたは正しいです、私はノードを 'b1'値でリンクする必要があります。最初は明確にしないと申し訳ありませんが、 'b2'は既に' b2_2'以外の要素を持っており、コードはそれらのプロセスをクリアします。私はこの点を明確にするように質問を編集しました。 – twinchenzo

+0

簡単な修正 - 上記を参照してください。 –

+0

ありがとう、マイケル、あなたの答えは正しい方向に私を回し、 'xsl:key'のルールを勉強した後、私はあなたの提案されたソリューションを実際のデータにうまく実装しました。 – twinchenzo

関連する問題