2017-04-19 13 views
-1
<root> 
<xnode> 
    <Node1/> 
    <Node2/> 
    <Node3> 
     <CNode1> 
     <CCNode1> 
      <CCField1> 
      <CCField2> 
       <CCCNode1/> 
      </CCNode1> 
     <CCNode2> 
      <CCCNode3/> 
    </Node3> 

     <Node4/> 
</xnode> 
<xnode> 
    <Node1/> 
    <Node2/> 
    <Node3> 
     <CNode1> 
      <CCNode2> 
      <CCCNode3/> 
    </Node3> 
     <Node4/> 
    </xnode> 
    <xnode> 
    <Node1/> 
    <Node2/> 
    <Node3> 
     <CNode1> 
     <CCNode1> 
      <CCField1> 
      <CCField2> 
       <CCCNode1/> 
      </CCNode1> 
     <CCNode2> 
      <CCCNode3/> 
     </Node3> 
     <Node4/> 
    </xnode> 
</root> 

上記のxmlでは、Node3-CNode1-CCNode1以外のすべてのノードと値をコピーする必要があります。すなわち、CCNode1がその子要素を含むコピーとして存在する場合には、対応するフィールドおよび子要素でCCNode1を作成する。ここでは、最初と3番目のxnodeはCCNode1を持ち、2番目のxnodeではxnodeが欠けています。したがって、最初と3番目のnode1をそのままコピーし、2番目のxノードのCCNode1とその子要素をダミー値で作成します。xsltディープxmlが作成されていない場合はコピー

XSLTでこれを実現する方法を提案してください。

おかげ

+0

あなたのXMLの例はよく形成されていません。たとえば、Node3タグは閉じられません。だから、あなたの入力XMLを修正し、出力XMLを提供することをお勧めします。 – Bluewood66

+0

申し訳ありませんが、編集中に見逃しました、今更新されました。 – tsjo

答えて

0

だから、私が言うことができる最高のは、あなたがすべてをコピーするアイデンティティーテンプレートを必要とするということです。次に、CCNode1ノードを持たないNode3/CNode1ノードを選択するには、次のようなテンプレートが必要です。ノードを追加することができます。

<xsl:template match="Node3/CNode1[not(.//CCNode1)]"> 
    <xsl:copy> 

    Add your ccNode1 and child nodes here. 

    <!-- Output other child nodes of CNode1 --> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

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

ありがとうございます。それはうまくいきますが、私の実装を変えることができると思っていました。 CCNode1がCCField1の値0を持っていないか存在していても、ファイルの残りの部分をそのままコピーすれば、すべての子ノードを持つxノード全体を削除できますか? – tsjo

+0

条件を満たすxnodeを選択するテンプレートを追加するだけです。テンプレート内で何もしないでください。これは抑制する。すなわち、 あなたのニーズを満たすためにXPathで遊ぶことができます。 – Bluewood66

+0

私はすでにそれを試しましたが、それでも私が必要としない親ノードをコピーしています。すなわちはまだコピー取得しています。私は全体のxノードとサブノードがコピーされないようにする必要があります。提案してください。ありがとう – tsjo

関連する問題