2013-05-27 82 views
0

我有一個場景,其中有兩個變量(不同架構,但保存與同一對象有關的內容),並且我需要變量1中不存在的變量2中的那些值
XSLT中兩個不同XML變量之間的差異

這裏,
一個變量保存現有的用戶,而另一個從平面文件

這裏持有用戶是兩個變量

從平面文件輸入

用戶:

<ReadUsersResponse> 
    <tns:User> 
     <tns:Name>aa1</tns:Name> 
     <tns:EmailAddress>bb1</tns:EmailAddress> 
    </tns:User> 
    <tns:User> 
     <tns:Name>aa2</tns:Name> 
     <tns:EmailAddress>bb2</tns:EmailAddress> 
    </tns:User> 
</ReadUsersResponse> 

現有用戶:

<ReadProjectCodesResponse> 
    <ProjectCode> 
     <CodeValue>aa3</CodeValue> 
     <Description>bb3</Description> 
     <ObjectId>1418</ObjectId> 
    </ProjectCode> 
    <ProjectCode> 
     <CodeValue>aa1</CodeValue> 
     <Description>bb1</Description> 
     <ObjectId>1419</ObjectId> 
    </ProjectCode> 
</ReadProjectCodesResponse> 

如果你注意觀察,Name在變量1對應CodeValue的變量2。同樣,變量1中的Email變量1到Description

我需要產生不變量2存在用戶的列表,這意味着

  • 變量1 - 變量2 (即只aa2,因爲它是不存在的)

,改造結果爲不同的格式:

<tns:CreateActivityCodes> 
    <tns:ActivityCode> 
     <tns:CodeTypeObjectId>SomeConstantNumber(1280)</tns:CodeTypeObjectId> 
     <tns:CodeValue>aa2</tns:CodeValue> 
     <tns:Description>bb2</tns:Description> 
    </tns:ActivityCode> 
</tns:CreateActivityCodes> 

我一直在做這方面的一些工作,但想不出OU解決方案。 有人會給我一個解決方案嗎?

+0

見http://p2p.wrox.com/xslt/79311-how-process-multiple-input-xml-files-single-xslt.html – Himanshu

+0

會在哪裏CodeTypeObjectId'的'價值從何而來?第一個文件沒有「ObjectId」。 –

回答

1

我爲tns命名空間前綴定義了namespace-uri,並將它應用於「Variable1」XML和樣式表。您需要調整它以匹配您的實際名稱空間。

下面的樣式表假設「Variable2」文件保存爲「ReadProjectCodesResponse.xml」並用document()函數讀取它以便比較「Variable1」和「Variable2」元素值。

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

    <xsl:variable name="ProjectCodes" 
        select="document('ReadProjectCodesResponse.xml')/*/*"/> 

    <xsl:template match="ReadUsersResponse"> 
     <tns:CreateActivityCode> 
      <xsl:apply-templates select="tns:User"/> 
     </tns:CreateActivityCode> 
    </xsl:template> 

    <xsl:template match="tns:User"> 
     <xsl:if test="not(tns:Name = $ProjectCodes/CodeValue)"> 
     <tns:ActivityCode> 
      <tns:CodeTypeObjectId>SomeConstantNumber(1280)</tns:CodeTypeObjectId> 
      <xsl:apply-templates select="@*|node()"/> 
     </tns:ActivityCode> 
     </xsl:if> 
    </xsl:template> 

    <xsl:template match="tns:Name"> 
     <tns:CodeValue> 
      <xsl:apply-templates /> 
     </tns:CodeValue> 
    </xsl:template> 

    <xsl:template match="tns:EmailAddress"> 
     <tns:Description> 
      <xsl:apply-templates /> 
     </tns:Description> 
    </xsl:template> 

</xsl:stylesheet> 
+1

我想你需要在xsl:中添加一個「not()'」來測試:if,因爲:「_I需要產生一個不存在於variable2_中的用戶列表」 –

+0

哎喲!對了謝謝。我已經糾正了答案。 –