用于添加ul列表层次结构的递归xslt函数需要修复

时间:2019-05-28 15:11:26

标签: 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>

我在做什么错?谢谢您的帮助!

1 个答案:

答案 0 :(得分:1)

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