我有一个场景,我有两个变量(不同的模式,但保持与同一个对象相关的内容),我需要来自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中不存在的用户列表,意思是
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>
我一直在做这方面的工作,但无法找到解决方案。 有人会为我提供解决方案吗?
答案 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>