2

以下の propNode.xmlのようなxmlファイルがあります

<NODES>
  <NODE>
<NODELINE CLASS="Item" TYPE="Item" >
  <ATTR_NODES>
    <ATTR_NODE NAME="myName" />
    <ATTR_NODE NAME="myDesc />
  </ATTR_NODES>
</NODELINE>
<NODELINE CLASS="Item1" TYPE="Item1" >
  <ATTR_NODES>
    <ATTR_NODE NAME="myName1" />
    <ATTR_NODE NAME="myDesc1" />
  </ATTR_NODES>
</NODELINE>
<NODELINE CLASS="Item2" TYPE="Item2" >
  <ATTR_NODES>
    <ATTR_NODE NAME="myName2" />
    <ATTR_NODE NAME="myDesc2" />
  </ATTR_NODES>
</NODELINE>
</NODE>
</NODES>

この xml を読みたいのですが、それを使用するには、次の 2 つの xml ファイル source.xmlをマージする必要があります。

<NODES>
  <NODE>
<NODELINE CLASS="Item" TYPE="Item" >
  <ATTR_NODES>
    <ATTR_NODE NAME="myName" VALUE="myNameValue" />
    <ATTR_NODE NAME="myDesc" VALUE="test-myDescValue" />
<ATTR_NODE NAME="myId" VALUE="test-myIdValue" />
  </ATTR_NODES>
</NODELINE>
<NODELINE CLASS="Item1" TYPE="Item1" >
  <ATTR_NODES>
    <ATTR_NODE NAME="myName1" VALUE="myNameValue1" />
    <ATTR_NODE NAME="myDesc1" VALUE="myDescValue1"/>
<ATTR_NODE NAME="myId1" VALUE="myIdValue1" />
  </ATTR_NODES>
</NODELINE>
<NODELINE CLASS="Item2" TYPE="Item2" >
  <ATTR_NODES>
    <ATTR_NODE NAME="myName2" VALUE="test-myNameValue2" />
    <ATTR_NODE NAME="myDesc2" VALUE="myDescValue2"/>
<ATTR_NODE NAME="myId2" VALUE="test-myIdValue2" />
  </ATTR_NODES>
</NODELINE>
  </NODE>
</NODES>

そしてtarget.xml

<NODES>
  <NODE>
<NODELINE CLASS="Item" TYPE="Item" >
  <ATTR_NODES>
    <ATTR_NODE NAME="myName" VALUE="myNameValue" />
    <ATTR_NODE NAME="myDesc" VALUE="myDescValue" />
<ATTR_NODE NAME="myId" VALUE="myIdValue" />
  </ATTR_NODES>
</NODELINE>
<NODELINE CLASS="Item1" TYPE="Item1" >
  <ATTR_NODES>
    <ATTR_NODE NAME="myName1" VALUE="myNameValue1" />
    <ATTR_NODE NAME="myDesc1" VALUE="myDescValue1"/>
<ATTR_NODE NAME="myId1" VALUE="myIdValue1" />
  </ATTR_NODES>
</NODELINE>
<NODELINE CLASS="Item2" TYPE="Item2" >
  <ATTR_NODES>
    <ATTR_NODE NAME="myName2" VALUE="myNameValue2" />
    <ATTR_NODE NAME="myDesc2" VALUE="myDescValue2"/>
<ATTR_NODE NAME="myId2" VALUE="myIdValue2" />
  </ATTR_NODES>
</NODELINE>
  </NODE>
</NODES>

条件は propNode.xml の読み取りです。@NAME の値が source.xml と target.xml で一致する場合、source.xml と target.xml の @VALUE の値を比較する必要があり、出力 xml が必要です。以下のように作成します。

desiredOutput.xml

<NODES>
  <NODE>
<NODELINE CLASS="Item" TYPE="Item" >
  <ATTR_NODES>
    <ATTR_NODE NAME="myName" SRCVALUE="myNameValue" TGTVALUE="myNameValue" ISDIFF="false" />
    <ATTR_NODE NAME="myDesc" SRCVALUE="test-myDescValue" TGTVALUE="myDescValue" ISDIFF="true" />
  </ATTR_NODES>
</NODELINE>
<NODELINE CLASS="Item1" TYPE="Item1" >
  <ATTR_NODES>
    <ATTR_NODE NAME="myName1" SRCVALUE="myNameValue1" TGTVALUE="myNameValue1" ISDIFF="false" />
    <ATTR_NODE NAME="myDesc1" SRCVALUE="myDescValue1" TGTVALUE="myDescValue1" ISDIFF="false" />
  </ATTR_NODES>
</NODELINE>
<NODELINE CLASS="Item2" TYPE="Item2" >
  <ATTR_NODES>
    <ATTR_NODE NAME="myName2" SRCVALUE="test-myNameValue2" TGTVALUE="myNameValue2" ISDIFF="true" /> />
    <ATTR_NODE NAME="myDesc2" SRCVALUE="myDescValue2" TGTVALUE="myDescValue2" ISDIFF="false" />
  </ATTR_NODES>
</NODELINE>
  </NODE>
</NODES>

desiredOutput.xml には、propNode.xml で @NAME の値が選択されている場合、ソースとターゲットの両方の @VALUE の値が含まれている必要があります。@VALUE の値が異なる場合、@ISDIFF の値は「true」または「false」である必要があります。

xsltを使用してこの操作全体が可能ですか? propNode.xml を使用して xsl を生成し、それを source.xml と target.xml に適用して目的の出力を生成するようなものですか? この xsl はどのようになりますか?

4

1 に答える 1

1

ATTR_NODEに存在するノード ( )のみをテストする必要があると仮定するとpropNode.xml、次の XSLT がその役割を果たします。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:my="some.uri" version="1.0">

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

    <xsl:template match="ATTR_NODE">
        <xsl:variable name="NodeLine" select="../../@CLASS" />
        <xsl:variable name="AttrName" select="@NAME" />
        <xsl:variable name="SrcValue" select="document('source.xml')//NODELINE[@CLASS=$NodeLine]//ATTR_NODE[@NAME=$AttrName]/@VALUE" />
        <xsl:variable name="TgtValue" select="document('target.xml')//NODELINE[@CLASS=$NodeLine]//ATTR_NODE[@NAME=$AttrName]/@VALUE" />
        <xsl:element name="ATTR_NODE">
            <xsl:attribute name="NAME">
                <xsl:value-of select="$AttrName"/>
            </xsl:attribute>
            <xsl:attribute name="SRCVALUE">
                <xsl:value-of select="$SrcValue" />
            </xsl:attribute>
            <xsl:attribute name="TGTVALUE">
                <xsl:value-of select="$TgtValue" />
            </xsl:attribute>
            <xsl:attribute name="ISDIFF">
                <xsl:value-of select="$SrcValue!=$TgtValue" />
            </xsl:attribute>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

ID テンプレートは、ソースとターゲットのチェックpropNodeごとに特別な処理を行ってをトラバースおよびコピーするために使用され、同等かどうかが評価されます。のアイデンティティを確立するのに十分であると仮定しました-そうでない場合は、追加のチェックを追加する必要があります。ATTR_NODEVALUENODE_LINE/@CLASSNODE_LINE@TYPE

xslt は に対して実行されpropnode.xmlsource.xmltarget.xmlは同じフォルダーに存在する必要があります。

出力

<?xml version="1.0" encoding="utf-8"?>
<NODES>
    <NODE>
        <NODELINE CLASS="Item" TYPE="Item">
            <ATTR_NODES>
                <ATTR_NODE NAME="myName" SRCVALUE="myNameValue" TGTVALUE="myNameValue" ISDIFF="false" />
                <ATTR_NODE NAME="myDesc" SRCVALUE="test-myDescValue" TGTVALUE="myDescValue" ISDIFF="true" />"
            </ATTR_NODES>
        </NODELINE>
        <NODELINE CLASS="Item1" TYPE="Item1">
            <ATTR_NODES>
                <ATTR_NODE NAME="myName1" SRCVALUE="myNameValue1" TGTVALUE="myNameValue1" ISDIFF="false" />
                <ATTR_NODE NAME="myDesc1" SRCVALUE="myDescValue1" TGTVALUE="myDescValue1" ISDIFF="false" />
            </ATTR_NODES>
        </NODELINE>
        <NODELINE CLASS="Item2" TYPE="Item2">
            <ATTR_NODES>
                <ATTR_NODE NAME="myName2" SRCVALUE="test-myNameValue2" TGTVALUE="myNameValue2" ISDIFF="true" />
                <ATTR_NODE NAME="myDesc2" SRCVALUE="myDescValue2" TGTVALUE="myDescValue2" ISDIFF="false" />
            </ATTR_NODES>
        </NODELINE>
    </NODE>
</NODES>
于 2012-11-27T12:55:32.323 に答える