【发布时间】:2021-07-16 07:57:17
【问题描述】:
我有 2 个 xml 文件,要求通过匹配节点将两个文件合并为一个。以下是文件。
第一个 XML 是(原始的):
<EF_Candidate_List>
<EF_Candidate>
<candidate_id>1</candidate_id>
<field_1>foo</field_1>
</EF_Candidate>
<EF_Candidate>
<candidate_id>2</candidate_id>
<field_1>bar</field_1>
</EF_Candidate>
</EF_Candidate_List>
第二个XML需要基于节点合并
<EF_Candidate_List>
<EF_Candidate>
<candidate_id>1</candidate_id>
<account_number>10</account_number>
<account_number>50</account_number>
<EF_Candidate>
<candidate_id>2</candidate_id>
<account_number>20</account_number>
</EF_Candidate>
</EF_Candidate_List>
期待 xml 结果文件。
<EF_Candidate_List>
<EF_Candidate>
<candidate_id>1</candidate_id>
<field_1>foo</field_1>
<column>10</column>
<column>50</column>
</EF_Candidate>
<EF_Candidate>
<candidate_id>2</candidate_id>
<field_1>bar</field_1>
<column>20</column>
</EF_Candidate>
</EF_Candidate_List>
我在xsl下面创建了。
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="val" select="document('test2.xml')/EF_Candidate_List/EF_Candidate/account_number" />
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="EF_Candidate">
<xsl:copy>
<xsl:apply-templates/>
<column>
<xsl:value-of select="$val" />
</column>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
它会生成下面的 xml 文件。
<?xml version="1.0" encoding="UTF-8"?>
<EF_Candidate_List>
<EF_Candidate>
<candidate_id>1</candidate_id>
<field_1>foo</field_1>
<column>10</column>
</EF_Candidate>
<EF_Candidate>
<candidate_id>2</candidate_id>
<field_1>bar</field_1>
<column>10</column>
</EF_Candidate>
</EF_Candidate_List>
我对 XSLT 还很陌生,所以请原谅这个可能是新手的问题。任何指导将不胜感激。提前致谢。
【问题讨论】:
-
好吧,尝试编写一个带有谓词的 XPath 表达式,您可以将一个文档的
EF_Candidate中的candidate_id与另一个文档中的一个文档进行比较,或者使用current()XSLT 函数或通过将一个文档中的 id 存储在一个变量中。如果有机会迁移到 XSLT 2 或 3,请使用密钥。