2

我有两组 XML 节点,我想找到具有相同“电话”子节点的元素。例如:

<set1>
  <node>
    <phone>111</phone>
    <name>John</name>
  </node>
  <node>
    <phone>444</phone>
    <name>Amy</name>
  </node>
  <node>
    <phone>777</phone>
    <name>Robin</name>
  </node>
</set1>

<set2>
  <node>
    <phone>111</phone>
    <city>Moscow</city>
  </node>
  <node>
    <phone>444</phone>
    <city>Prag</city>
  </node>
  <node>
    <phone>999</phone>
    <city>Rome</city>
  </node>
</set2>

现在我想得到以下内容:

<result>
  <node>
    <phone>111</phone>
    <name>John</name>
    <city>Moscow</city>
  </node>
  <node>
    <phone>444</phone>
    <name>Amy</name>
    <city>Prag</city>
  </node>
  <node>
    <phone>777</phone>
    <name>Robin</name>
  </node>
  <node>
    <phone>999</phone>
    <city>Rome</city>
  </node>
</result>

我是 xslt 的初学者,我设法合并两个 xml 并将它们放在一个 html 表中。但是这个配对比我高出一个层次。

4

1 回答 1

2

使用钥匙

<xsl:key name="phone" match="node" use="phone"/>

然后用Muenchian 分组如下:

<xsl:template match="/">
  <result>
    <xsl:apply-templates select="//node[generate-id() = generate-id(key('phone', phone)[1])]"/>
  </result>
</xsl:template>

<xsl:template match="node">
  <xsl:copy>
    <xsl:copy-of select="phone"/>
    <xsl:copy-of select="key('phone', phone)/*[not(self::phone)]"/>
  </xsl:copy>
</xsl:template>

为了可读性添加

<xsl:output indent="yes"/>
于 2012-12-08T16:43:03.383 回答