我正在尝试使用XSLT合并两个XML文件。我需要匹配两个文件中必须存在的tradeId
节点值,并将所有内容复制到file1
。
欢迎任何帮助。所有类似的例子都基于属性和相同的XML,这对我不起作用。
File1.xml
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<trade>
<tradeId>1</tradeId>
<createdBy>1</createdBy>
<createdOnDate>2</createdOnDate>
<Payment>
<indicator>3</indicator>
<updateBy>4</updateBy>
</Payment>
<Parties>
<partyId>5</partyId>
<partyRoleTypeCode>6</partyRoleTypeCode>
</Parties>
<Product>
<term>7</term>
<shortDescription>8</shortDescription>
</Product>
</trade>
<trade>
<tradeId>2</tradeId>
<createdBy>10</createdBy>
<createdOnDate>20</createdOnDate>
<Payment>
<indicator>30</indicator>
<updateBy>40</updateBy>
</Payment>
<Parties>
<partyId>50</partyId>
<partyRoleTypeCode>60</partyRoleTypeCode>
</Parties>
<Product>
<term>70</term>
<shortDescription>80</shortDescription>
</Product>
</trade>
</S:Body>
</S:Envelope>
File2.xml
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<financialexpectation>
<tradeId>1</tradeId>
<stateCode>TBD</stateCode>
<methodCode>TBD</methodCode>
<TypeCode>NONE</TypeCode>
</financialexpectation>
<financialexpectation>
<tradeId>2</tradeId>
<stateCode>TBD</stateCode>
<methodCode>TBD</methodCode>
<TypeCode>NONE</TypeCode>
</financialexpectation>
<financialexpectation>
<tradeId>3</tradeId>
<stateCode>TBD</stateCode>
<methodCode>TBD</methodCode>
<TypeCode>NONE</TypeCode>
</financialexpectation>
</S:Body>
</S:Envelope>
预期输出
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<trade>
<tradeId>1</tradeId>
<createdBy>1</createdBy>
<createdOnDate>2</createdOnDate>
<Payment>
<indicator>3</indicator>
<updateBy>4</updateBy>
</Payment>
<Parties>
<partyId>5</partyId>
<partyRoleTypeCode>6</partyRoleTypeCode>
</Parties>
<Product>
<term>7</term>
<shortDescription>8</shortDescription>
</Product>
<financialexpectation>
<tradeId>1</tradeId>
<stateCode>TBD</stateCode>
<methodCode>TBD</methodCode>
<TypeCode>NONE</TypeCode>
</financialexpectation>
</trade>
<trade>
<tradeId>2</tradeId>
<createdBy>10</createdBy>
<createdOnDate>20</createdOnDate>
<Payment>
<indicator>30</indicator>
<updateBy>40</updateBy>
</Payment>
<Parties>
<partyId>50</partyId>
<partyRoleTypeCode>60</partyRoleTypeCode>
</Parties>
<Product>
<term>70</term>
<shortDescription>80</shortDescription>
</Product>
<financialexpectation>
<tradeId>2</tradeId>
<stateCode>TBD</stateCode>
<methodCode>TBD</methodCode>
<TypeCode>NONE</TypeCode>
</financialexpectation>
</trade>
</S:Body>
</S:Envelope>
答案 0 :(得分:0)
如果您将此样式表应用于file1.xml
,则会使用file2.xml
功能明确包含document
中的相应信息。由于相关元素没有命名空间,因此无需在样式表中声明命名空间S
。我希望这会有所帮助。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="trade">
<xsl:copy>
<xsl:apply-templates/>
<xsl:copy-of select="document('file2.xml')//financialexpectation[tradeId=current()/tradeId]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
<强>输出强>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<trade>
<tradeId>1</tradeId>
<createdBy>1</createdBy>
<createdOnDate>2</createdOnDate>
<Payment>
<indicator>3</indicator>
<updateBy>4</updateBy>
</Payment>
<Parties>
<partyId>5</partyId>
<partyRoleTypeCode>6</partyRoleTypeCode>
</Parties>
<Product>
<term>7</term>
<shortDescription>8</shortDescription>
</Product>
<financialexpectation>
<tradeId>1</tradeId>
<stateCode>TBD</stateCode>
<methodCode>TBD</methodCode>
<TypeCode>NONE</TypeCode>
</financialexpectation>
</trade>
<trade>
<tradeId>2</tradeId>
<createdBy>10</createdBy>
<createdOnDate>20</createdOnDate>
<Payment>
<indicator>30</indicator>
<updateBy>40</updateBy>
</Payment>
<Parties>
<partyId>50</partyId>
<partyRoleTypeCode>60</partyRoleTypeCode>
</Parties>
<Product>
<term>70</term>
<shortDescription>80</shortDescription>
</Product>
<financialexpectation>
<tradeId>2</tradeId>
<stateCode>TBD</stateCode>
<methodCode>TBD</methodCode>
<TypeCode>NONE</TypeCode>
</financialexpectation>
</trade>
</S:Body>
</S:Envelope>