如何将适当的xml元素与xmlstarlet配对?

时间:2012-12-08 16:20:43

标签: xslt xpath

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

<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表中。但这种配对比我高一层。

1 个答案:

答案 0 :(得分:1)

使用密钥

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

然后与Muenchian grouping分组如下:

<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"/>