XSLT中两个不同XML变量之间的差异

时间:2013-05-27 10:56:28

标签: xslt

我有一个场景,我有两个变量(不同的模式,但保持与同一个对象相关的内容),我需要来自Variable1的那些在Variable2中不存在的值

下面,
One Variable保存现有用户,另一个保存用户来自平面文件

以下是两个变量

来自平面文件输入的用户:

<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>

如果您观察到,Variable1中的Name对应于Variable2中的CodeValue。同样,变量1中的Email变量2中的Description

我需要生成一个变量2中不存在的用户列表,意思是

  • Variable1 - Variable2 (即只有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>

我一直在做这方面的工作,但无法找到解决方案。 有人会为我提供解决方案吗?

1 个答案:

答案 0 :(得分: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>