簡體   English   中英

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"

Edit1:添加了響應
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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM