根据属性值对 XSLT 元素进行分组
Grouping XSLT Element based on a attribute value
我有一个需求,对学生记录进行唯一化改造。
示例 IP:
<Root>
<A>
<B>
<C>
<qty>1</qty>
<item id="1"></stud>
</C>
<C>
<qty>2</qty>
<item id="1"></stud>
</C>
</B>
</A>
O/P 需要:
<Root>
<A>
<B>
<C>
<qty>3</qty>
<item id="1"></stud>
</C>
</B>
</A>
如何在 xslt 1.0 中执行此操作?我试过 Muenchian 分组!但是失败了。请指导我!
定义一个键 <xsl:key name="c-by-id" match"B/C" use="item/@id"/>
,然后使用它来禁止复制与
重复的项目
<xsl:template match="B/C[not(generate-id() = generate-id(key('c-by-id', item/@id)[1]))]"></xsl:template>
并用
计算总和
<xsl:template match="B/C/qty">
<xsl:copy>
<xsl:value-of select="sum(key('c-by-id', ../item/@id)/qty)"/>
</xsl:copy>
</xsl:template>
连同身份转换模板,您拥有完整的样式表
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:key name="c-by-id" match="B/C" use="item/@id"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="B/C[not(generate-id() = generate-id(key('c-by-id', item/@id)[1]))]"></xsl:template>
<xsl:template match="B/C/qty">
<xsl:copy>
<xsl:value-of select="sum(key('c-by-id', ../item/@id)/qty)"/>
</xsl:copy>
</xsl:template>
</xsl:transform>
我有一个需求,对学生记录进行唯一化改造。
示例 IP:
<Root>
<A>
<B>
<C>
<qty>1</qty>
<item id="1"></stud>
</C>
<C>
<qty>2</qty>
<item id="1"></stud>
</C>
</B>
</A>
O/P 需要:
<Root>
<A>
<B>
<C>
<qty>3</qty>
<item id="1"></stud>
</C>
</B>
</A>
如何在 xslt 1.0 中执行此操作?我试过 Muenchian 分组!但是失败了。请指导我!
定义一个键 <xsl:key name="c-by-id" match"B/C" use="item/@id"/>
,然后使用它来禁止复制与
<xsl:template match="B/C[not(generate-id() = generate-id(key('c-by-id', item/@id)[1]))]"></xsl:template>
并用
计算总和<xsl:template match="B/C/qty">
<xsl:copy>
<xsl:value-of select="sum(key('c-by-id', ../item/@id)/qty)"/>
</xsl:copy>
</xsl:template>
连同身份转换模板,您拥有完整的样式表
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:key name="c-by-id" match="B/C" use="item/@id"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="B/C[not(generate-id() = generate-id(key('c-by-id', item/@id)[1]))]"></xsl:template>
<xsl:template match="B/C/qty">
<xsl:copy>
<xsl:value-of select="sum(key('c-by-id', ../item/@id)/qty)"/>
</xsl:copy>
</xsl:template>
</xsl:transform>