1

同じ構造の 2 つの XML 変数がある場合があります。両者の違いを知りたい。

V1 (新しいレコードを表す) には要素 a1、a2、a3、a4 があり、V2 (既存のレコードを表す) には要素 a5、a7、a3 があるとします。

ここで、V1 にある変数 a3 が V2 に存在するので、それを削除して、{a1, a2, a4} のみを保持する新しい変数が必要です。

これが私の2つのXML変数です

初め :

<ReadUsersResponse>
    <User>
        <EmailAddress>aaa</EmailAddress>
        <Name>a</Name>
        <ObjectId>101</ObjectId>
    </User>
    <User>
        <EmailAddress>bbb</EmailAddress>
        <Name>b</Name>
        <ObjectId>103</ObjectId>
    </User>
    <User>
        <EmailAddress>ccc</EmailAddress>
        <Name>c</Name>
        <ObjectId>104</ObjectId>
    </User>
</ReadUsersResponse>

2番 :

<ReadUsersResponse>
    <User>
        <EmailAddress>ddd</EmailAddress>
        <Name>d</Name>
        <ObjectId>104</ObjectId>
    </User>
    <User>
        <EmailAddress>bbb</EmailAddress>
        <Name>b</Name>
        <ObjectId>103</ObjectId>
    </User>
    <User>
        <EmailAddress>ccc</EmailAddress>
        <Name>c</Name>
        <ObjectId>107</ObjectId>
    </User>
</ReadUsersResponse>

それぞれの ObjectId を比較して、ここに私が欲しいものがあります: (ObjectId 103 は、Variable2 で既に利用可能であるため、トリムします)

<ReadUsersResponse>
    <User>
        <EmailAddress>aaa</EmailAddress>
        <Name>a</Name>
        <ObjectId>101</ObjectId>
    </User>
    <User>
        <EmailAddress>ccc</EmailAddress>
        <Name>c</Name>
        <ObjectId>104</ObjectId>
    </User>
</ReadUsersResponse>

やってみたけど無理。

私が従ったアプローチは、最初にこれらの 2 つの XML 変数を 1 つの変数にマージし、2 つの別々のタグ Ex ..first Var... ..second Var...

私はこれに問題があり、それを理解できません。これは正しいアプローチですか?または、別の方法はありますか?誰かが解決策を知っていますか。

前もって感謝します

よろしくお願いします

4

2 に答える 2

0

次のようなことを試してください:

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

    <xsl:key name="kuser" match="User" 
             use="concat(ObjectId,'#', EmailAddress, '#', Name)" />
    <xsl:variable name="u2" select="document('doc_2.xml')"/>

    <xsl:template match="User">
        <xsl:variable name="user_found">
            <xsl:apply-templates select="$u2/ReadUsersResponse" mode="checkuser" >
                <xsl:with-param name="user" select="." />
            </xsl:apply-templates>
        </xsl:variable>
        <xsl:if test="$user_found != 'true'">
            <xsl:copy>
                <xsl:apply-templates />
            </xsl:copy>
        </xsl:if>
    </xsl:template>

    <xsl:template match="ReadUsersResponse" mode="checkuser">
        <xsl:param name="user"/>
        <xsl:if test="key('kuser', concat($user/ObjectId,'#', $user/EmailAddress, '#', $user/Name))" >
            <xsl:text>true</xsl:text>
    </xsl:if>
    </xsl:template>
    <xsl:template match="node() | @*">
        <xsl:copy>
            <xsl:apply-templates select="@* | node() " />
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

次の出力が生成されます。

<ReadUsersResponse>
        <User>
                <EmailAddress>aaa</EmailAddress>
                <Name>a</Name>
                <ObjectId>101</ObjectId>
        </User>

        <User>
                <EmailAddress>ccc</EmailAddress>
                <Name>c</Name>
                <ObjectId>104</ObjectId>
        </User>
</ReadUsersResponse>

これらのキー値use="concat(ObjectId,'#', EmailAddress, '#', Name)"は、ユーザーがチェックする必要がある部分に応じて調整できます。

いくつかの説明については、次のとおりです。例:別のドキュメント内のルックアップ テーブル
重要な点は、(document() 関数を使用して) ロードされたソース ドキュメントごとに別のインデックスが準備されることです。

于 2013-05-07T06:37:19.840 に答える