【发布时间】:2018-05-27 13:01:54
【问题描述】:
我正在努力进行以下转换。
我的源是一个我不知道根节点的 XML(它是由 ETL 动态创建的,我无法输出 XML。因此是 presumed_root)。
XML 源
<presumed_root>
<IndexGroup>
<IndexDate>01/01/2017</IndexDate>
<IndexRate>US_CPI</IndexRate>
<IndexValue>190</IndexValue>
</IndexGroup>
<IndexGroup>
<IndexDate>01/04/2017</IndexDate>
<IndexRate>US_CPI</IndexRate>
<IndexValue>195</IndexValue>
</IndexGroup>
<IndexGroup>
<IndexDate>01/07/2017</IndexDate>
<IndexRate>US_CPI</IndexRate>
<IndexValue>193</IndexValue>
</IndexGroup>
[...]
</presumed_root>
所需的 XML 输出
<root>
<IndexGroup>
<IndexRate>US_CPI</IndexRate>
<IndexNumbers>
<IndexCode>US_CPI@2017</IndexCode>
<IndexYear>2017</IndexYear>
<Month01>190</Month01>
<Month02/>
<Month03/>
<Month04>195</Month04>
<Month05/>
<Month06/>
<Month07>193</Month07>
[...]
</IndexNumbers>
</IndexGroup>
</root>
所以,我尝试按 IndexRate 和 IndexYear 对值进行分组,并将每个月放在一个不同的节点中。
XSL 失败
<xsl:template match="/">
<xsl:for-each-group select="/IndexGroup" group-by="concat(translate(normalize-space(IndexRate),' ','_'),'@',xs:string(year-from-date(xs:date(IndexDate))))">
<IndexGroup>
<xsl:variable name="IndexCode" select="current-group()/translate(normalize-space(IndexRate),' ','_')"/>
<IndexRate><xsl:value-of select="$IndexCode"/></IndexRate>
<IndexNumbers>
<xsl:variable name="IndexCode"><xsl:value-of select="current-grouping-key()"/></xsl:variable><!-- Code = Index @ Year -->
<xsl:variable name="Month01"><xsl:value-of select="translate(replace(current-group()[month-from-date(xs:date(current-group()/IndexDate))=1]/IndexValue, '\p{Z}+', ''),',','.')"/></xsl:variable>
<xsl:variable name="Month02"><xsl:value-of select="translate(replace(current-group()[month-from-date(xs:date(current-group()/IndexDate))=2]/IndexValue, '\p{Z}+', ''),',','.')"/></xsl:variable>
[...]
</IndexNumbers>
[...]
</IndexGroup>
使用这种 XML 结构和 XSL,for-each-group 根本不会对任何内容进行分组。 因此,我无法同时填充一年中的所有月份/索引组合。
任何帮助将不胜感激,请随时要求进一步的解释/上下文/输入/示例。
问候,
【问题讨论】:
-
我的回答有帮助还是您还有问题?
-
嗨丹尼尔,感谢您的解决方案。
-
唉,我仍然遇到问题:使用相同的源和 XSL,我没有与您相同的结果。更具体地说,for-each-group 不是分组。这导致我有 2 个可能的原因: - 源 XML 没有根元素(可能,因为我不知道 IndexGroup 节点上方是什么) - 或者嵌入式 XSL 解释器中存在错误(我没有可以访问产品代码,因为我只实现了这个产品)。我将只花几个小时调查第一个案例。不然我就放弃了……
-
这两种解释在我看来都不太可能,但我们无法诊断您的问题,除非我们确切地知道您在做什么以及它是如何失败的,并且您没有向我们提供足够的信息。由于我认为您是初学者,因此您甚至可能错误地调用了转换,因此说明您是如何运行它会有所帮助。
-
产品开发团队已确认每个IndexGroup节点没有封闭的顶部节点。因此我的“presumed_root”确实是无效的。通过对数据源本身的智能调整,我成功地使用了您的大部分代码。您的解决方案是正确的,非常有用且聪明,因此被接受!再次感谢。
标签: xml xslt xslt-grouping