0

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

在这里,
一个变量保存现有用户,另一个保存平面文件中的用户

这是两个变量

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

<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。同样,Email在变量 1 到Description变量 2 中。

我需要生成一个变量 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>

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

4

1 回答 1

1

我为命名空间前缀定义了一个命名空间uri,tns并将其应用于“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>
于 2013-05-27T11:47:18.570 回答