2013-05-07 49 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>