使用 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 组合具有相同 ID 及其值的节点 (XML)