如何将一个元素分组,然后将兄弟姐妹作为子元素返回?
这是我想要实现的内容的剪辑(这只是一个嗤之以鼻,所以实际上代码将有多个客户,订单和食物类型)
customers.xml
<customers>
<customer>
<fname>James</fname>
<orderid>1234</orderid>
</customer>
orders.xml中
<orders>
<order>
<orderid>1234</orderid>
<name>soda</name>
<size>large</size>
<type>drink</type>
</order>
<order>
<orderid>1234</orderid>
<name>beer</name>
<size>medium</size>
<type>drink</type>
</order>
<order>
<orderid>1234</orderid>
<name>burger</name>
<size>large</size>
<type>food</type>
的Output.xml
<orders>
<order>
<fname>James</fname>
<orderid>1234<orderid>
<bought type="food">
<name name="burger">
<size>large</size>
</name>
</bought>
<bought type="drink">
<name name="soda">
<size>large</size>
</name>
<name name="beer">
<size>medium</size>
</name>
</bought>
</order>
</orders>
所以我想将所有类型的食物分组在一起,并将它们的名称和大小作为子元素,我将如何以最简单的方式实现这一目标?
答案 0 :(得分:1)
XSLT 2.0有for-each-group
例如
<xsl:param name="orders-url" select="'orders.xml'"/>
<xsl:variable name="orders-doc" select="doc($orders-url)"/>
<xsl:key name="orderid" match="order" use="orderid"/>
<xsl:template match="customer">
<order>
<xsl:copy-of select="fname, orderid"/>
<xsl:for-each-group select="key('orderid', orderid, $orders-doc)" group-by="type">
<bought type="{type}">
<xsl:apply-templates select="current-group()"/>
</bought>
</xsl:for-each-group>
</order>
</xsl:template>
<xsl:template match="order">
<name name="{name}">
<xsl:copy-of select="size"/>
</name>
</xsl:template>