gpt4 book ai didi

xml - XSL 分组输出

转载 作者:行者123 更新时间:2023-12-02 22:35:41 25 4
gpt4 key购买 nike

我有一个带有记录的 XML,一些记录相互关联,因此,我想在输出中将它们组合在一起。

XML:

<Records>
<Record id="1" group="10" />
<Record id="2" group="20" />
<Record id="3" group="20" />
<Record id="4" group="20" />
</Records>

目前,我显示

<span>1</span><span>2</span><span>3</span><span>4</span>

我想显示的是(基于同组的记录)

<span>1</span><span>2-4</span>

我已经研究过使用 preceding-sibling::Record/@group 来查看分组在 Record 的迭代之间是否发生了变化,但我正在努力弄清楚如何实现我需要的 2-4 分组。

这是我目前所做的,穿插了一些评论来说明我正在尝试做的事情:

<xsl:for-each select="Records/Record">
<xsl:if test="@group != preceding-sibling::Record/@group">
<!-- obviously here we need 2-4...somehow? -->
<span><xsl:value-of="@id" /></span>
</xsl:if>
</xsl:for-each>

最佳答案

这个转换:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:strip-space elements="*"/>

<xsl:key name="kFollowing" match="Record"
use="generate-id(preceding-sibling::*
[not(@group = current()/@group)
][1])"/>

<xsl:template match="/*">
<xsl:apply-templates mode="makeGroup" select=
"Record[not(@group = preceding-sibling::*[1]/@group)]"/>
</xsl:template>

<xsl:template match="Record" mode="makeGroup">
<xsl:variable name="vGroup"
select="key('kFollowing', generate-id(preceding-sibling::*[1]))"/>
<span>
<xsl:value-of select="$vGroup[1]/@id"/>
<xsl:if test="$vGroup[2]">
<xsl:value-of select="concat('-', $vGroup[last()]/@id)"/>
</xsl:if>
</span>
</xsl:template>
</xsl:stylesheet>

应用于提供的 XML 文档时:

<Records>
<Record id="1" group="10" />
<Record id="2" group="20" />
<Record id="3" group="20" />
<Record id="4" group="20" />
</Records>

产生想要的、正确的结果:

<span>1</span><span>2-4</span>

解释:

  1. 这是位置分组,使用一个键来定义组成一个组的所有相邻 Record 元素。

  2. 这是一种高效(次线性)算法,因为使用了 key 。使用兄弟轴的算法通常是 O(N^2) -- 时间复杂度的二次方,如果 sibling 的总数可能太慢 N很大。

关于xml - XSL 分组输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11469043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com