0

この質問は、属性値に基づいて xslt を使用して 2 つの要素をマージすることに似ていますが、これを別の方法でよりよく理解できるようにしようとしています。

名前が同じ 2 つの要素を含む xml ファイルがありますが、2 番目の要素は最初の要素の一部です。例:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- This is first element-->
<book>
    <mbean code="org.book.mybooks"  name="mycompany.props.jndi:name=mybookprops">   
        <attribute name="bookprops">
            abc.mybook.onebook=@Value@
            def.mybook.twobook=@Value@
            ghi.myebook.threebook=@Value@
        </attribute>
    </mbean>
    <!--This is second element and is part of first element-->
    <book>
        <mbean code="org.book.mybooks"  name="mycompany.props.jndi:name=mybookprops">   
            <attribute name="bookprops">
            abc.mybook.onebook=@New_Value@
            def.mybook.twobook=@New_Value@
            ghi.myebook.fourbook=@Value@

            </attribute>
        </mbean>
    </book><!--closing tag of second element-->
</book><!--closing tag of first element-->

目的は:

両方の要素を 1 つの要素に結合し、両方の要素が類似したノードを持ち、ノードの値が異なる場合は、最初の属性ノードの値を 2 番目の属性ノードに置き換えます。

私が考えている手順:

  1. 1 番目と 2 番目の要素のノードを並べ替えます。
  2. 最初の要素のノードを分割し、変数に割り当てます。例: 最初の要素 abc.mybook.onebook=@Value@ のノードは 2 つに分割され、変数 varaible1=abc.mybook.onebook と varaible2=@Value@ に割り当てられます。
  3. 同様の方法で、2 番目の要素のノードを分割し、それらを変数に割り当てます。2 番目の要素 abc.mybook.onebook=@New_Value@ の例ノードは 2 つに分割され、変数 3=abc.mybook.onebook および変数 4=@New_Value@ として変数に割り当てられます。
  4. ここで、最初の要素変数を 2 番目の要素変数と一致させます。例: variable1 が variable3 と等しい場合、variable2 を variable4 に置き換えます。それ以外の場合は、最初の要素ノードをコピーし、2 番目の要素ノードをコピーします。

これはシェルまたはbashで非常に簡単に実行できますが、要件はxsltを使用することであるため、これをどのように達成できるかを理解しようとしています.

私が期待している最終的な出力は次のとおりです。

<book>
    <mbean code="org.book.mybooks"  name="mycompany.props.jndi:name=mybookprops">   
        <attribute name="bookprops">
            abc.mybook.onebook=@New_Value@
            def.mybook.twobook=@New_Value@
            ghi.myebook.threebook=@Value@
            ghi.myebook.fourbook=@Value@
        </attribute>
    </mbean>
</book>
4

1 に答える 1