代码之家  ›  专栏  ›  技术社区  ›  sanjay

使用for each group从父级分解嵌套列表

  •  0
  • sanjay  · 技术社区  · 7 年前

    我有这样的xml,

    <doc>
        <list list-type="alpha-lower">
            <list-item>
                <label>a)</label>
                <p>text1</p>
                <list list-type="order">
                    <list-item>
                        <label>1)</label>
                        <p>text2</p>
                    </list-item>
                    <list-item>
                        <label>2)</label>
                        <p>text3</p>
                    </list-item>
                    <list-item>
                        <label>3)</label>
                        <p>text4</p>
                    </list-item>
                </list>
            </list-item>
            <list-item>
                <label>b)</label>
                <p>text5</p>
                <list list-type="order">
                    <list-item>
                        <label>1)</label>
                        <p>text6</p>
                    </list-item>
                    <list-item>
                        <label>2)</label>
                        <p>text7</p>
                    </list-item>
                    <list-item>
                        <label>3)</label>
                        <p>text8</p>
                    </list-item>
                </list>
            </list-item>
        </list>
    </doc>
    

    这里存在嵌套列表,我需要将嵌套列表与父列表分开。

    这是我的预期输出。

    <doc>
        <list list-type="alpha-lower">
            <list-item>
                <label>a)</label>
                <p>text1</p>
            </list-item>
        </list>
        <list list-type="order">
            <list-item>
                <label>1)</label>
                <p>text2</p>
            </list-item>
            <list-item>
                <label>2)</label>
                <p>text3</p>
            </list-item>
            <list-item>
                <label>3)</label>
                <p>text4</p>
            </list-item>
        </list> 
        <list list-type="alpha-lower">
            <list-item>
                <label>b)</label>
                <p>text5</p>
            </list-item>
        </list>
        <list list-type="order">
            <list-item>
                <label>1)</label>
                <p>text6</p>
            </list-item>
            <list-item>
                <label>2)</label>
                <p>text7</p>
            </list-item>
            <list-item>
                <label>3)</label>
                <p>text8</p>
            </list-item>
        </list> 
    </doc>
    

    我正在使用XSLT 2.0来完成这项任务,我尝试对每个组使用XSLT,但没有找到解决方案。

    这是我试过的,

    <xsl:template match="list[descendant::list]">
            <xsl:for-each-group select="*" group-by="list">
                <list list-type="{current()/@list-type}">
                    <xsl:apply-templates select="current-group()"/>
                </list>
            </xsl:for-each-group>
        </xsl:template>
    

    有人能给我建议一种从XSLT执行此操作的方法吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Joel M. Lamsen    7 年前

    我没有使用 xsl:for-each-group ,我用了一个普通的 xsl:for-each . 尝试以下操作:

    <xsl:template match="list[descendant::list]">
        <xsl:variable name="Ltype" select="@list-type"/>
        <xsl:for-each select="list-item">
            <list list-type="{$Ltype}">
                <list-item>
                    <xsl:apply-templates select="node()[not(self::list)]"/>
                </list-item>
            </list>
            <xsl:apply-templates select="list"/>
        </xsl:for-each>
    </xsl:template>