【问题标题】:XSLT: turn flat list into hierarchyXSLT:将平面列表转换为层次结构
【发布时间】:2012-02-07 12:08:18
【问题描述】:

我尝试了解 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深,...)下一节应该是当前的孩子,如果是同一层次,它应该是下一个兄弟.

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

another similar question 声明“在 XSLT 2.0 中,使用新的分组函数会相当容易。” - 这可能很容易,但我不明白。

【问题讨论】:

  • 你有固定数量的关卡还是可能有无限关卡?
  • @Chris 有固定数量的级别 (4)。

标签: xslt xslt-2.0


【解决方案1】:

这是一个例子:

<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”的任何级别。

Saxon 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>

【讨论】:

    猜你喜欢
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多