この質問は、属性値に基づいて 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 番目と 2 番目の要素のノードを並べ替えます。
- 最初の要素のノードを分割し、変数に割り当てます。例: 最初の要素 abc.mybook.onebook=@Value@ のノードは 2 つに分割され、変数 varaible1=abc.mybook.onebook と varaible2=@Value@ に割り当てられます。
- 同様の方法で、2 番目の要素のノードを分割し、それらを変数に割り当てます。2 番目の要素 abc.mybook.onebook=@New_Value@ の例ノードは 2 つに分割され、変数 3=abc.mybook.onebook および変数 4=@New_Value@ として変数に割り当てられます。
- ここで、最初の要素変数を 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>