Xml 如何基于唯一元素连接两个节点集?

Xml 如何基于唯一元素连接两个节点集?,xml,join,xslt-1.0,nodes,Xml,Join,Xslt 1.0,Nodes,我有一个包含不同节点集的大型xml文件,需要使用xsl根据两个节点都包含的唯一元素值进行组合 以下是需要转换的xml文件示例: <root> <node1> <funds> <fund> <FundId>a</FundId> <FundName>fund a</FundName> <SomeInfo>some info

我有一个包含不同节点集的大型xml文件,需要使用xsl根据两个节点都包含的唯一元素值进行组合

以下是需要转换的xml文件示例:

<root>
  <node1>
    <funds>
      <fund>
        <FundId>a</FundId>
        <FundName>fund a</FundName>
        <SomeInfo>some info</SomeInfo>
      </fund>
      <fund>
        <FundId>b</FundId>
        <FundName>fund b</FundName>
        <SomeInfo>some info</SomeInfo>
      </fund>
      <fund>
        <FundId>c</FundId>
        <FundName>fund c</FundName>
        <SomeInfo>some info</SomeInfo>
      </fund>
    </funds>
  </node1>
  <node2>
    <funds>
      <fund>
        <FundId>a</FundId>
        <MaxInvestmentAmount>200</MaxInvestmentAmount>
        <MinInvestmentAmount>1</MinInvestmentAmount>
      </fund>
      <fund>
        <FundId>b</FundId>
        <MaxInvestmentAmount>100</MaxInvestmentAmount>
        <MinInvestmentAmount>5</MinInvestmentAmount>
      </fund>
      <fund>
        <FundId>c</FundId>
        <MaxInvestmentAmount>50</MaxInvestmentAmount>
        <MinInvestmentAmount>20</MinInvestmentAmount>
      </fund>
    </funds>
  </node2>
</root>

A.
基金a
一些信息
B
b基金
一些信息
C
基金c
一些信息
A.
200
1.
B
100
5.
C
50
20
下面是所需的输出:

<node>
    <funds>
        <fund>
            <FundId>a<FundId/>
            <FundName>fund a</FundName>
            <SomeInfo>some info</SomeInfo>
            <MaxInvestmentAmount>200</MaxInvestmentAmount>
            <MinInvestmentAmount>1</MinInvestmentAmount>
        </fund>
        <fund>
            <FundId>b<FundId/>
            <FundName>fund b</FundName>
            <SomeInfo>some info</SomeInfo>
            <MaxInvestmentAmount>100</MaxInvestmentAmount>
            <MinInvestmentAmount>5</MinInvestmentAmount>
        </fund>
        <fund>
            <FundId>c<FundId/>
            <FundName>fund c</FundName>
            <SomeInfo>some info</SomeInfo>
            <MaxInvestmentAmount>50</MaxInvestmentAmount>
            <MinInvestmentAmount>20</MinInvestmentAmount>
        </fund>
    </funds>
</node>

A.
基金a
一些信息
200
1.
B
b基金
一些信息
100
5.
C
基金c
一些信息
50
20

我尝试过模板匹配,但这似乎不像我尝试过的那样有效,因为两个节点都有相同的内部节点名称,所以它们总是互相覆盖

实现这一点的可靠方法是在
元素上使用
xsl:key
,并将
FundId
作为键。此方法的一个相关限制是,仅合并第一个子元素的
FundId
键(此处为
)。如果其他子元素包含更多值,则此方法将无法按预期工作

以下是XSLT-1.0样式表:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" />
  <xsl:key name="keyFund" match="fund" use="FundId" />   

  <xsl:template match="/root">
    <node>
        <funds>
            <xsl:for-each select="*[1]/funds/fund">
                <fund>
                    <xsl:copy-of select="FundId" />
                    <xsl:for-each select="key('keyFund',FundId)">
                        <xsl:copy-of select="current()/*[not(self::FundId)]" />
                    </xsl:for-each>
                </fund>
            </xsl:for-each>
        </funds>
    </node>
  </xsl:template>

</xsl:stylesheet>

其输出为:

<?xml version="1.0"?>
<node>
    <funds>
        <fund>
            <FundId>a</FundId>
            <FundName>fund a</FundName>
            <SomeInfo>some info</SomeInfo>
            <MaxInvestmentAmount>200</MaxInvestmentAmount>
            <MinInvestmentAmount>1</MinInvestmentAmount>
        </fund>
        <fund>
            <FundId>b</FundId>
            <FundName>fund b</FundName>
            <SomeInfo>some info</SomeInfo>
            <MaxInvestmentAmount>100</MaxInvestmentAmount>
            <MinInvestmentAmount>5</MinInvestmentAmount>
        </fund>
        <fund>
            <FundId>c</FundId>
            <FundName>fund c</FundName>
            <SomeInfo>some info</SomeInfo>
            <MaxInvestmentAmount>50</MaxInvestmentAmount>
            <MinInvestmentAmount>20</MinInvestmentAmount>
        </fund>
    </funds>
</node>

A.
基金a
一些信息
200
1.
B
b基金
一些信息
100
5.
C
基金c
一些信息
50
20