gpt4 book ai didi

XSLT:将平面列表转化为层次结构

转载 作者:行者123 更新时间:2023-12-04 05:58:54 25 4
gpt4 key购买 nike

我尝试了解 XSLT 2.0 中的分组功能。我的源文件是

<root>
<entry level="a" name="aaa"/>
<entry level="a" name="bbb"/>
<entry level="b" name="ccc"/>
<entry level="c" name="ddd"/>
<entry level="a" name="eee"/>
<entry level="a" name="fff"/>
<entry level="b" name="ggg"/>
</root>

结果应该是这样的
<section name="aaa"/>
<section name="bbb">
<section name="ccc">
<section name="ddd" />
</section>
</section>
<section name="eee"/>
<section name="fff">
<section name="ggg" />
</section>

即:如果后面有一个更深的条目(b比a更深,...),下一个部分应该是当前的 child ,如果是相同的级别,它应该是下一个兄弟。

我试过 xsl:group-by select="entry" group-by="@level"这给了我一个合理的分组,但我不知道如何打开该部分向下,如果有向下。

another similar question其中指出“在 XSLT 2.0 中,使用新的分组功能会很容易”。 - 这可能很容易,但我不明白。

最佳答案

下面是一个例子:

<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:mf="http://example.com/mf"
exclude-result-prefixes="xs mf"
version="2.0">

<xsl:output indent="yes"/>

<xsl:function name="mf:group" as="element(section)*">
<xsl:param name="entries" as="element(entry)*"/>
<xsl:param name="level" as="xs:string"/>
<xsl:for-each-group select="$entries" group-starting-with="entry[@level = $level]">
<section name="{@name}">
<xsl:sequence select="mf:group(current-group() except ., codepoints-to-string(string-to-codepoints($level)[1] + 1))"/>
</section>
</xsl:for-each-group>
</xsl:function>

<xsl:template match="root">
<xsl:copy>
<xsl:sequence select="mf:group(entry, 'a')"/>
</xsl:copy>
</xsl:template>

</xsl:stylesheet>

应该适用于从“a”到“z”的任何级别。

撒克逊 9.4,当在上面运行时
<root>
<entry level="a" name="aaa"/>
<entry level="a" name="bbb"/>
<entry level="b" name="ccc"/>
<entry level="c" name="ddd"/>
<entry level="a" name="eee"/>
<entry level="a" name="fff"/>
<entry level="b" name="ggg"/>
</root>

产出
<root>
<section name="aaa"/>
<section name="bbb">
<section name="ccc">
<section name="ddd"/>
</section>
</section>
<section name="eee"/>
<section name="fff">
<section name="ggg"/>
</section>
</root>

关于XSLT:将平面列表转化为层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9175991/

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