group-by - XSLT group on child node
问题描述
I'am try to convert XML on group of child nodes. Main information is in bill node, it must be group by bill numbers.
original XML, this is simplified version of original XML
<items>
<item>
<bill>10</bill>
<name>first (10)</name>
<price>111</price>
</item>
<item>
<bill>10</bill>
<name>second (10)</name>
<price>222</price>
</item>
<item>
<bill>10</bill>
<name>third (10)</name>
<price>333</price>
</item>
<item>
<bill>11</bill>
<name>first (11)</name>
<price>1</price>
</item>
<item>
<bill>11</bill>
<name>second (11)</name>
<price>2</price>
</item>
</items>
final file
<bills>
<bill>
<number>10</number>
<items>
<item>
<nameitem>first (10)</nameitem>
<priceitem>111</priceitem>
</item>
<item>
<nameitem>second (10)</nameitem>
<priceitem>222</priceitem>
</item>
<item>
<nameitem>third (10)</nameitem>
<priceitem>333</priceitem>
</item>
</items>
</bill>
<bill>
<number>11</number>
<items>
<item>
<nameitem>first (11)</nameitem>
<priceitem>1</priceitem>
</item>
<item>
<nameitem>second (11)</nameitem>
<priceitem>2</priceitem>
</item>
</items>
</bill>
</bills>
there is working XSLT, for basic grouping, but I have not idea, how to build another structure inside bill node, based on final XML
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="group-by-bill" match="item" use="bill"/>
<xsl:template match="items">
<bills>
<xsl:for-each select="item[generate-id()=generate-id (key('group-by-bill', bill)[1])]">
<bill number="{bill}">
<xsl:copy-of select="key('group-by-bill', bill)"/>
</bill>
</xsl:for-each>
</bills>
</xsl:template>
解决方案
用这个:
<xsl:template match="items">
<bills>
<xsl:for-each select="item[generate-id()=generate-id (key('group-by-bill', bill)[1])]">
<bill>
<number><xsl:value-of select="bill"/></number>
<items>
<xsl:for-each select="//item[bill = current()/bill]">
<item>
<xsl:copy-of select="name|price"/>
</item>
</xsl:for-each>
</items>
</bill>
</xsl:for-each>
</bills>
</xsl:template>
推荐阅读
- hortonworks-data-platform - 我在哪里可以找到 Druid 代理/协调器配置详细信息?
- python-3.x - 熊猫列到行的转换不起作用?
- ubuntu - 在 Ansible 中比较 Ubuntu 主要和次要版本
- facebook-graph-api - 获取公共组的公开帖子
- python - 在 Python 中编码 base64 失败
- python - 如何在 python 数据框中的多列之间执行“或”?
- json - 在 Flutter 中以间隔自动获取 API 数据
- angular - 在 if / else 中返回订阅结果
- reactjs - 如何使用带有 ReactJs 的 ChartistJs 库更改条形图标签的颜色和字体
- recursion - 在 mips 程序集中查找数组中元素的总和(使用递归)