【问题标题】:XSLT 1.0: Group by attribute and join attribute valuesXSLT 1.0:按属性分组并连接属性值
【发布时间】: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&lt;itemdescription&gt;.new66711ABC&lt;itemdescription&gt;.used824" 它将项目分组,但所有内容都作为一个块。
  • 我无法理解您的示例数据,输入有两个 result 元素和 &lt;id&gt;22&lt;/id&gt;,只有一个想要的输出,没有对输入条件进行任何分组或合并。结果中的&lt;id&gt;33&lt;/id&gt; 是从哪里来的?

标签: xml xslt xslt-1.0 muenchian-grouping


【解决方案1】:

因为您只想合并条件数据但保留单独的 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

【讨论】:

  • 感谢您抽出宝贵时间@Martin,非常感谢。我尝试了您的解决方案,但它仍然没有附加&lt;condition&gt;new,used&lt;/condition&gt;。 "Items": { "result": [ { "id": 11, "name": "ABC", "description": ".", "condition": [ "new" ] } 我改变了match="result[id = '11']/condition" 获取 result/id 中的任何 id。
  • 非常感谢。我终于能够将它操纵到我的用例中,并且效果很好。也感谢您的指导。欣赏它。
猜你喜欢
  • 2015-01-02
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
  • 2018-01-21
  • 1970-01-01
  • 1970-01-01
  • 2015-12-19
相关资源
最近更新 更多