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つのステップで所望の変換を作る方法を見ることができますが、解決策は簡単で、表面上にあるような気がします。ターゲットノードを想定されているサブノードに配置する方法を釘付けにすることはできないので、正しい方向に任意のヒントを理解することができます。
は、このような迅速な答えをありがとう!あなたは正しいです、私はノードを 'b1'値でリンクする必要があります。最初は明確にしないと申し訳ありませんが、 'b2'は既に' b2_2'以外の要素を持っており、コードはそれらのプロセスをクリアします。私はこの点を明確にするように質問を編集しました。 – twinchenzo
簡単な修正 - 上記を参照してください。 –
ありがとう、マイケル、あなたの答えは正しい方向に私を回し、 'xsl:key'のルールを勉強した後、私はあなたの提案されたソリューションを実際のデータにうまく実装しました。 – twinchenzo