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

哎哟!对了谢谢。我已经纠正了答案。 –