XSLT包装除了一个之外的任意元素

时间:2015-12-09 17:07:38

标签: xslt xslt-1.0

我关注this topic,但仍然无法解决下面描述的问题。在<ol>元素内部,我需要根据此示例将任意元素(/节点)包装到<li>中:

<ol>
    text
    <p>text</p>
    <li>
        text
        <p>text</p>
    </li>
    <p>text</p>
    text
    <sub>text</sub>
</ol>

转换为:

<ol>
    <li>
        text
        <p>text</p>
    </li>
    <li>
        text
        <p>text</p>
    </li>
    <li>
        <p>text</p>
        text
        <sub>text</sub>
    </li>
</ol>

我正在使用xslt 1.0。 非常感谢任何帮助!

更新示例

<root>
    <ol>
        text
        <p>text</p>
        <li>
           text
           <p>text</p>
        </li>
        <p>text</p>
        text
        <sub>text</sub>
    </ol>
    <ol>
        text
        <p>text</p>
    </ol>
</root>

转换为:

<root>
    <ol>
        <li>
            text
            <p>text</p>
        </li>
        <li>
            text
            <p>text</p>
        </li>
        <li>
            <p>text</p>
            text
            <sub>text</sub>
        </li>
    </ol>
    <ol>
        <li>
            text
            <p>text</p>
        </li>
    </ol>
</root>

1 个答案:

答案 0 :(得分:2)

我会尝试将其解析为Muenchian分组,其中密钥计算preceding-sibling::li元素的所有非li子节点的ol元素:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:key name="group" match="ol/node()[not(self::li)]" use="count(preceding-sibling::li)"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="ol/node()[not(self::li)][generate-id() = generate-id(key('group', count(preceding-sibling::li))[1])]">
        <li>
            <xsl:copy-of select="key('group', count(preceding-sibling::li))"/>
        </li>
    </xsl:template>

    <xsl:template match="ol/node()[not(self::li)][not(generate-id() = generate-id(key('group', count(preceding-sibling::li))[1]))]"/>

</xsl:transform>

http://xsltransform.net/pPzifpy的在线示例。