2012-12-08 2 views
1

У меня есть два набора узлов XML, и я хочу найти элементы, у которых есть идентичный «телефонный» ребенок. Например:Как соединить соответствующие элементы xml с xmlstarlet?

<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

Используйте ключ

<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"/> 
Смежные вопросы