使用 XSLT 程序对具有逗号分隔值的 XML 元素进行分组

Posted

技术标签:

【中文标题】使用 XSLT 程序对具有逗号分隔值的 XML 元素进行分组【英文标题】:Group XML elements with comma seperated values with XSLT program 【发布时间】:2021-12-30 11:20:06 【问题描述】:

我们是 xslt 编程的新手,请您帮助我们处理 xslt 程序。 我们需要根据“id”标签对xml元素进行分组,并用逗号连接其他xml标签。

输入xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<root>
 <row>
  <id>123</id>
  <functional_manager__c.users>1234567</functional_manager__c.users>
 </row>
 <row>
  <id>123</id>
  <functional_manager__c.users>1200000</functional_manager__c.users>
 </row>
 <row>
  <id>111</id>
  <functional_manager__c.users>11111111</functional_manager__c.users>
 </row>
 <row>
  <id>111</id>
  <functional_manager__c.users>2222222</functional_manager__c.users>
 </row>
 <row>
  <id>123</id>
  <editor__v.users>1234567</editor__v.users>
  </row>
  <row>
   <id>123</id>
   <editor__v.users>1200000</editor__v.users>
  </row>
  <row>
    <id>111</id>
    <learning_partner__c.users>11111111</learning_partner__c.users>
  </row>
  <row>
    <id>111</id>
    <learning_partner__c.users>2222222</learning_partner__c.users>
  </row>
  </root>

所需输出:

<?xml version="1.0" encoding="UTF-8"?>
<root>
 <row>
  <id>123</id>
  <functional_manager__c.users>1234567,1200000</functional_manager__c.users>
 </row>
 <row>
  <id>111</id>
  <functional_manager__c.users>11111111,2222222</functional_manager__c.users>
 </row>
 <row>
  <id>123</id>
  <editor__v.users>1234567,1200000</editor__v.users>
  </row>
  <row>
    <id>111</id>
    <learning_partner__c.users>11111111,2222222</learning_partner__c.users>
  </row>
  </root>

我们尝试过的代码:

<?xml version="1.0" encoding="utf-8"?>
 <xsl:stylesheet version="2.0" exclude-result-prefixes="xsl wd xsd this env"
  xmlns:wd="urn:com.workday/bsvc"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
   xmlns:this="urn:this-stylesheet">

    <xsl:output indent="yes" method="xml"/>
   <xsl:template match="/">
   <Sharingsettings>
    <xsl:for-each-group select="/root/row" group-by="id">
    <row>
     <ID>
      <xsl:value-of select="id"/>
      </ID>
      <functional_manager__c.users>
       <xsl:value-of select="//current-group()//functional_manager__c.users">

    </xsl:value-of>
     </functional_manager__c.users>
     </row>
     </xsl:for-each-group>
     </Sharingsettings>
     </xsl:template>
     </xsl:stylesheet>

我们正在尝试使用 XSLT 程序,但它没有正确提供所需的输出。

非常感谢您

【问题讨论】:

为什么不发布您的尝试以便我们修复它,而不必从头开始为您编写代码。 查看***.com/tags/xslt-grouping/info 中的group-adjacent 示例 【参考方案1】:

使用 XSLT 3,您可以使用

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="3.0"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="#all"
  expand-text="yes">

  <xsl:output method="xml" indent="yes"/>

  <xsl:mode on-no-match="shallow-copy"/>
  
  <xsl:template match="root">
    <xsl:copy>
      <xsl:for-each-group select="row" group-adjacent="id">
        <xsl:copy>
          <xsl:apply-templates/>
        </xsl:copy>
      </xsl:for-each-group>
    </xsl:copy>
  </xsl:template>
  
  <xsl:template match="row/*[not(self::id)]">
    <xsl:copy>
      <xsl:value-of select="current-group()/*[node-name() = node-name(current())]" separator=","/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

【讨论】:

嗨马丁,我尝试了上面的代码,它给出了类似“net.sf.saxon.trans.UncheckedXPathException:没有当前组”的错误 您到底使用的是哪个版本的 Saxon,您运行的是我发布的确切代码示例还是进行了一些修改?另外,您是使用普通处理还是尝试使用流式处理(current-group() 确实不能像我上面使用的那样工作)? 该示例在 xsltfiddle.liberty-development.net/jy6KM7c 在线,并且运行良好(使用 Saxon 10.6 作为 XSLT 处理器)。 另一种解释可能是在输入示例中使用命名空间,您需要编辑您的问题以向我们展示代表性示例,以便我们重现问题。 嗨 Martin,我们的工具使用 xslt 3.0 和 SAXON EE 9.9.1.6。我们的工具中出现“net.sf.saxon.trans.UncheckedXPathException:没有当前组”错误。

以上是关于使用 XSLT 程序对具有逗号分隔值的 XML 元素进行分组的主要内容,如果未能解决你的问题,请参考以下文章

XSLT 将嵌套的 xml 元素写为一个带有逗号分隔值字符串的元素

如何使用 XSLT/XPath 生成逗号分隔的列表?

XSLT 创建 CSV 但维护来自 XML 节点的逗号

使用 XSLT 组合具有相同 ID 及其值的节点 (XML)

使用 xslt 2.0 合并具有相同父属性值的元素的 xml 内容

XSLT:XML 第一个属性需要转换为具有第二个属性值的元素