XSLT 1.0:按属性分组并连接属性值
XSLT 1.0: Group by attribute and join attribute values
我有以下简化的 XML 数据,我想按类别 ID 对其进行分组,看看负载中是否有任何类似的记录,如果有,我想将条件与找到的元素结合起来。
<Items>
<result>
<id>11</id>
<name>ABC</name>
<condition>new</condition>
</result>
<result>
<id>22</id>
<name>XYZ</name>
<condition>new</condition>
</result>
<result>
<id>11</id>
<name>ABC</name>
<condition>used</condition>
</result>
<result>
<id>33</id>
<name>PQR</name>
<condition>used</condition>
</result>
</Items>
分组后的预期结果:
<Items>
<result>
<id>11</id>
<name>ABC</name>
<condition>new,used</condition>
</result>
<result>
<id>22</id>
<name>XYZ</name>
<condition>new</condition>
</result>
<result>
<id>11</id>
<name>ABC</name>
<condition>new,used</condition>
</result>
<result>
<id>33</id>
<name>PQR</name>
<condition>used</condition>
</result>
</Items>
我如何在 XSLT 1.0 中为存在多个相似记录的大型负载执行此操作?用分组的方法可行吗?
当前逻辑:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sdml="http://selfhtml.org/sdml">
<xsl:template match="/Items">
<xsl:copy>
<xsl:for-each-group select="result" group-by="id">
<records type="{current-grouping-key()}" >
<xsl:apply-templates select="current-group()" />
</records>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
当前响应:
"@type": "11",
"$": "11ABC<itemdescription>.new11ABC<itemdescription>.used"
编辑 1:已添加回复
Edit2:已编辑拼写错误
因为您只想合并条件数据但保留单独的 result
元素,并且只想识别您可以使用的特定 ID 的组
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:key name="result-group" match="result[id = 11]/condition" use="../id"/>
<xsl:template match="result[id = 11]/condition">
<xsl:copy>
<xsl:for-each select="key('result-group', ../id)">
<xsl:if test="position() > 1">,</xsl:if>
<xsl:value-of select="."/>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty-development.net/3MvmXj1
在 XSLT 2 或 3 中,您可以在键和模板匹配模式中使用变量:https://xsltfiddle.liberty-development.net/a9GPfY
我有以下简化的 XML 数据,我想按类别 ID 对其进行分组,看看负载中是否有任何类似的记录,如果有,我想将条件与找到的元素结合起来。
<Items>
<result>
<id>11</id>
<name>ABC</name>
<condition>new</condition>
</result>
<result>
<id>22</id>
<name>XYZ</name>
<condition>new</condition>
</result>
<result>
<id>11</id>
<name>ABC</name>
<condition>used</condition>
</result>
<result>
<id>33</id>
<name>PQR</name>
<condition>used</condition>
</result>
</Items>
分组后的预期结果:
<Items>
<result>
<id>11</id>
<name>ABC</name>
<condition>new,used</condition>
</result>
<result>
<id>22</id>
<name>XYZ</name>
<condition>new</condition>
</result>
<result>
<id>11</id>
<name>ABC</name>
<condition>new,used</condition>
</result>
<result>
<id>33</id>
<name>PQR</name>
<condition>used</condition>
</result>
</Items>
我如何在 XSLT 1.0 中为存在多个相似记录的大型负载执行此操作?用分组的方法可行吗?
当前逻辑:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sdml="http://selfhtml.org/sdml">
<xsl:template match="/Items">
<xsl:copy>
<xsl:for-each-group select="result" group-by="id">
<records type="{current-grouping-key()}" >
<xsl:apply-templates select="current-group()" />
</records>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
当前响应:
"@type": "11",
"$": "11ABC<itemdescription>.new11ABC<itemdescription>.used"
编辑 1:已添加回复
Edit2:已编辑拼写错误
因为您只想合并条件数据但保留单独的 result
元素,并且只想识别您可以使用的特定 ID 的组
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:key name="result-group" match="result[id = 11]/condition" use="../id"/>
<xsl:template match="result[id = 11]/condition">
<xsl:copy>
<xsl:for-each select="key('result-group', ../id)">
<xsl:if test="position() > 1">,</xsl:if>
<xsl:value-of select="."/>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty-development.net/3MvmXj1
在 XSLT 2 或 3 中,您可以在键和模板匹配模式中使用变量:https://xsltfiddle.liberty-development.net/a9GPfY