2013-05-07 44 views
1

我有一個情況,其中有2個相同結構的XML變量。我想弄清楚兩者之間的區別。XSLT - 2個XML變量之間的區別

假設V1(代表新記錄)都有元素A1,A2,A3,A4 和V2(代表已經存在的記錄)的元素A5,A7,A3

這裏,可變A3是存在於V1在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> 

二:

<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,因爲它是在變量2已發售)

<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個獨立的標籤 防爆 ..first無功的做法... ..second瓦爾...

我遇到問題,無法弄清楚。這是正確的方法嗎?還是有其他方法嗎?有誰知道解決方案。

由於提前

問候

回答

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)"可以根據適合用戶應該選擇哪部分用戶cked。

對於一些解釋有:例如Lookup table in a separate document
一個重要的一點是,一個單獨的索引被用於被加載每個源文件製備(使用文件()函數)。

0

另一種解決方案是:

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

    <xsl:param name="first"> 
    <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> 
    </xsl:param> 
    <xsl:param name="second"> 
    <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> 
    </xsl:param> 

    <xsl:key name="User" match="User" use="ObjectId"/> 
    <xsl:template match="/"> 
    <xsl:for-each select="$first//User"> 
     <xsl:variable name="ObjectId" select="ObjectId"/> 
     <xsl:variable name="User"> 
     <xsl:copy-of select="."/> 
     </xsl:variable> 
     <xsl:message> 
     <xsl:copy-of select="$User"/> 
     </xsl:message> 
     <xsl:choose> 
     <xsl:when 
      test="$ObjectId = $second//User/ObjectId[preceding-sibling::EmailAddress = $User/User/EmailAddress]"/> 
     <xsl:otherwise> 
      <xsl:copy> 
      <xsl:copy-of select="."/> 
      </xsl:copy> 
     </xsl:otherwise> 
     </xsl:choose> 
    </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet>