我有两个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的新手,所以请原谅这个潜在的新手问题。如有任何指导,我们将不胜感激。提前谢谢。
当您匹配EF_candidate时,您可以创建一个具有当前候选id的变量。然后从test2.xml中获取所有账号,其中EF_Candidate包含与当前候选id值相同的Candidate_id。然后为每个账号创建一个具有其值的列元素。
<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="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="EF_Candidate">
<xsl:variable name="current_candidate_id" select="candidate_id"/>
<xsl:variable name="account-numbers" select="document('test2.xml')/EF_Candidate_List/EF_Candidate[candidate_id = $current_candidate_id]/account_number" />
<xsl:copy>
<xsl:apply-templates/>
<xsl:for-each select="$account-numbers">
<column>
<xsl:value-of select="."/>
</column>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>