【发布时间】:2020-09-05 13:51:39
【问题描述】:
我有以下简化的 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"
Edit1:添加响应
Edit2:错字编辑
【问题讨论】:
-
所以您已经设法将标签用于 XSLT 1.0 的分组技术 Muenchian 分组,但您不能将任何教程(如 jenitennison.com/xslt/grouping/muenchian.html)应用于您自己的数据?
-
我对 Muenchian 分组进行了研究,并遵循了其他类似的问题,我认为这可以使用 Muenchian 分组来完成,但是我无法成功实现它。因此,我发布一些帮助。谢谢你的参考。 :)
-
如果您尝试使用 Muechian 分组,您尝试定义哪个键?您的 XSLT 1 尝试看起来如何?你得到哪个错误的结果或错误?
-
感谢您的回信。我得到以下输出,我已将其编辑得更小。
"@type": "11", "$": "11ABC<itemdescription>.new66711ABC<itemdescription>.used824"它将项目分组,但所有内容都作为一个块。 -
我无法理解您的示例数据,输入有两个
result元素和<id>22</id>,只有一个想要的输出,没有对输入条件进行任何分组或合并。结果中的<id>33</id>是从哪里来的?
标签: xml xslt xslt-1.0 muenchian-grouping