首页 > 解决方案 > 用于添加 ul 列表层次结构的递归 xslt 函数需要修复

问题描述

我正在尝试使用递归函数按大纲级别嵌套平面元素,但该函数会从某些元素中删除文本。否则,我将接近此工作,因为元素已按大纲级别正确嵌套。

这是源 XML。目标是将较高的轮廓元素嵌套在较低的内部。

<article>
    <h3 class="icon component">
        <img src="images/component.png" alt="component" class="bullet"/>
    <span>Component: Forms</span>
    </h3>
    <p class="url details" data-outline="4">Sample: <a href="https://foo.com">foo.com</a></p>
    <p class="details" data-outline="4">Start line: 540</p>
    <p class="details" data-outline="4">End line: 700</p>
    <p class="details" data-outline="4">Foo</p>
    <li class="icon task" data-outline="4">
        <img src="images/task.png" alt="task" class="bullet"/>
        <p class="gist">Foo (Sev 3) (H48) </p>
    </li>
    <img src="images/image37.png" class="details" alt="Foo" data-outline="5"/>
    <p class="details" data-outline="5">Foo foo</p>
    <p class="details" data-outline="5">Foo foo</p>
    <li class="icon task" data-outline="4">
        <img src="images/task.png" alt="task" class="bullet"/>
        <p class="gist">Foo <code>foo</code> (Sev 3) (G83)</p>
    </li>
   <img src="images/image38.png" class="details" alt="" data-outline="5"/>
    <p class="caption details" data-outline="5">Screenshot: Foo foo</p>
    <li class="icon task" data-outline="5">
        <img src="images/task.png" alt="task" class="bullet"/>
        <p class="gist">foo foo (Sev 2) (2.4.6, G131)</p>
    </li>
    <p class="details" data-outline="6">Foo foo</p>
</article>

这是功能:

<xsl:function name="fpp:group" as="node()*">
    <xsl:param name="elements" as="element()*"/>
    <xsl:param name="outline" as="xs:integer"/>
    <xsl:for-each-group select="$elements" group-starting-with="*[@data-outline[.=$outline]]">
        <xsl:choose>
            <xsl:when test="self::*[@data-outline[.=$outline]]">
                <xsl:element name="{name()}">
                    <xsl:copy-of select="@*"/>
                    <xsl:apply-templates select="*" mode="copy"/>
                    <xsl:sequence select="fpp:group(current-group() except ., $outline + 1)"/>
                </xsl:element>
            </xsl:when>
            <xsl:otherwise>
                <xsl:apply-templates select="current-group()" mode="copy"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:for-each-group>
</xsl:function>

我是这样称呼它的:

<xsl:template match="article[li[matches(@class,'icon')]]" mode="step06">
    <xsl:copy>
        <xsl:variable name="hierarchy" select="fpp:group(*, 4)"/>
        <xsl:apply-templates select="$hierarchy" mode="copy"/>
    </xsl:copy>
</xsl:template>

这是当前输出,正确嵌套,但请注意移动的 p.details 元素缺少它们的 text() 字符串:

<article>
    <h3 class="icon component">
        <img src="images/component.png" alt="component" class="bullet"/>
        <span>Component: Forms</span>
    </h3>
    <p class="url details" data-outline="4">
        <a href="https:foo.com">foo.com</a>
    </p>
    <p class="details" data-outline="4"/>
    <p class="details" data-outline="4"/>
    <p class="details" data-outline="4"/>
    <li class="icon task" data-outline="4">
        <img src="images/task.png" alt="task" class="bullet"/>
            <p class="gist">Foo (Sev 3) (H48) </p>
            <img src="images/image37.png" class="details" alt="Foo" data-outline="5"/>
            <p class="details" data-outline="5"/>
            <p class="details" data-outline="5"/>
    </li>
    <li class="icon task" data-outline="4">
        <img src="images/task.png" alt="task" class="bullet"/>
        <p class="gist">Foo <code>foo</code> (Sev 3) (G83)</p>
        <img src="images/image38.png" class="details" alt="" data-outline="5"/>
        <p class="caption details" data-outline="5"/>
        <li class="icon task" data-outline="5">
            <img src="images/task.png" alt="task" class="bullet"/>
            <p class="gist">Foo foo (Sev 2) (2.4.6, G131)</p>
            <p class="details" data-outline="6"/>
        </li>
    </li>
</article>

我究竟做错了什么?谢谢你的帮助!

标签: xslt

解决方案


我想<xsl:apply-templates select="*" mode="copy"/>应该是<xsl:apply-templates mode="copy"/>(或拼写出来<xsl:apply-templates select="node()" mode="copy"/>)。


推荐阅读