2

XSLT を介して 2 つの XML ファイルを比較したいと思います。ドキュメント 1 の特定のタイプのすべての要素がドキュメント 2 の同じ XPath 位置にある場合、比較は成功したと見なされます。

検討

<entry>
    <entry1>
        <entry2>
            <value type="1"/>
        </entry2>
    </entry1>
</entry>

ドキュメント 1 として。

監視対象の要素は、entry/entry1/entry2 にある「value」(属性 type=1) です。したがって、この意味での比較

<entry>
    <entry0/>
    <entry0/>
    <entry1>
        <entry2>
            <value type="1"/>
        </entry2>
    </entry1>
</entry>

成功したと見なされるべきですが、

<entry>
    <entry1>
        <value type="1"/>
    </entry1>
</entry>

"value" (属性 type=1 を持つ) が entry/entry1 にあるため、成功しません。との比較も

<entry>
    <entry1>
        <entry2>
            <value type="2"/>
        </entry2>
    </entry1>
</entry>

value の属性が type=2 であるため、成功しなかったと見なす必要があります。

XSLT でこのタスクを実行するための私の単純な試行は、次のようなものでした。

<xsl:template match="value">
   <xsl:if test="not(document($doc2)/.[@type=@type])">
      <xsl:text>something is missing</xsl:text>
   </xsl:if>
</xsl:template>

2 番目のドキュメント内の目的の XPath の選択が機能していないように見えるため、このアプローチは成功しませんでした。

多分あなたはこの質問に対処する方法について考えを持っていますか?

マット

4

2 に答える 2

3

あなたの質問は絶望的に不十分です。たとえば、doc1 のすべての要素に対応する要素が doc2 にあることを要求するだけでなく、doc2 のすべての要素にも対応する要素が doc1 にあることを要求しますか?

ただし、近いものは、 「そのような要素のすべての要素に対してV1D1そのような要素にname(V1)=N要素が存在し、 path($V) が"として定義されているV2D2name(V2)=N and deep-equal(V1, V2) and path(V1) = path(V2)string-join($V/ancestor-or-self::*/name())」という条件である可能性があります。これは、次の XPath 2.0 式に変換されます。

every $V1 in $D1//N satisfies
some $V2 in $D2//N satisfies
deep-equal($V1, $V2) and
string-join($V1/ancestor-or-self::*/name())
 = string-join($V2/ancestor-or-self::*/name())  
于 2011-03-10T14:15:32.860 に答える
0

楽しみのために、ケイ博士の答えの XSLT 1.0 翻訳:

    <xsl:variable name="vTest1">
        <xsl:for-each select="$D1//value[@type]">
            <xsl:variable name="vPath1">
                <xsl:for-each select="ancestor-or-self::*">
                    <xsl:value-of select="concat('/',name())"/>
                </xsl:for-each>
            </xsl:variable>
            <xsl:variable name="vTest2">
                <xsl:for-each select="$D2//value[@type=current()/@type]">
                    <xsl:variable name="vPath2">
                        <xsl:for-each select="ancestor-or-self::*">
                            <xsl:value-of select="concat('/',name())"/>
                        </xsl:for-each>
                    </xsl:variable>
                    <xsl:if test="$vPath1=$vPath2">True</xsl:if>
                </xsl:for-each>
            </xsl:variable>
            <xsl:if test="$vTest2=''">False</xsl:if>
        </xsl:for-each>
    </xsl:variable>

次に$vTest1 = ''、テストのブール値になります。

于 2011-03-10T15:56:51.853 に答える