如何在当前节点下创建一个包裹当前节点文本的新节点?

Posted

技术标签:

【中文标题】如何在当前节点下创建一个包裹当前节点文本的新节点?【英文标题】:How to create a new node under the current node that wraps the current node's text? 【发布时间】:2021-12-13 11:33:42 【问题描述】:

假设我有一个这样的 html 文件:

<ol>
<li>item 1</li>
<li>item 2</li>
</ol>

<ul>
<li>item 3</li>
<li>item 4</li>
<li> </li>
</ul>

对于那些列表项,无论是在有序列表还是无序列表中,我都想将

元素的文本包装在

标记中。这样处理后的 HTML 文件将如下所示:

<ol>
<li><p>item 1</p></li>
<li><p>item 2</p></li>
</ol>

<ul>
<li><p>item 3</p></li>
<li><p>item 4</p></li>
<li> </li>
</ul>

这是我写的.xsl文件:

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    

    <xsl:template match='/'>
        <xsl:apply-templates select='*' />
    </xsl:template>

    <xsl:template match='*'>
        <xsl:copy-of select='.' />
    </xsl:template>

    <xsl:template match='li'>
        <xsl:if test='normalize-space(.)'>
            <xsl:element name='p'>
                 <xsl:value-of select='.' />
            </xsl:element>
        </xsl:if>
    </xsl:template>

</xsl:stylesheet>

但是,这不起作用。谁能告诉我我哪里做错了?谢谢。

【问题讨论】:

【参考方案1】:

您有一个匹配li 的模板,但它从未被应用,因为处理其父元素的模板按原样复制其所有内容。此外,您的第一个模板是多余的; built-in template rules 会为您做到这一点。

试试:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
    <xsl:template match='*'>
        <xsl:copy>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match='li[normalize-space()]'>
        <xsl:copy>
            <p>
                <xsl:value-of select='.' />
            </p>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

【讨论】:

谢谢您,您提供了一个有见地的提示!我在自己对自己问题的回答中对您的代码进行了如下调整。【参考方案2】:

感谢@michael.hor257k。我已经解决了这个问题。 有效的代码如下:

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    

    <xsl:template match='*'>
        <xsl:copy select='.'>
            <xsl:apply-templates select='*'/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match='li[normalize-space()]'>
        <xsl:copy>
            <p>
                <xsl:value-of select='.' />
            </p>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

【讨论】:

除了在更严格的处理器上产生错误外,我没有看到您的“调整”添加了任何内容。 select 属性不允许在 xsl:copy 元素上使用。 xsltfiddle.liberty-development.net/pNEj9ek

以上是关于如何在当前节点下创建一个包裹当前节点文本的新节点?的主要内容,如果未能解决你的问题,请参考以下文章

深入学习jQuery节点操作

怎样在当前节点的第一个子元素节点之前增加子元素节点或子文本节点

jquery怎么获取当前节点的前一个节点

jquery如何获取某一个兄弟节点,不是全部的,是指定的兄弟节点

ACTIVITI如何获取下一步节点

EXTJS 4.1 如何在树面板中选择下一个叶节点