【问题标题】: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>
    

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

  • 【问题讨论】:

      标签: xml xslt xslt-1.0 xslt-2.0


      【解决方案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>
      

      【讨论】:

      猜你喜欢
      • 2013-09-17
      • 1970-01-01
      • 1970-01-01
      • 2011-12-23
      • 1970-01-01
      • 2010-11-04
      • 2016-03-13
      • 2011-10-20
      • 1970-01-01
      相关资源
      最近更新 更多