Html XSLT-add<;p>;转换为文本字符串,而不是\n

Html XSLT-add<;p>;转换为文本字符串,而不是\n,html,xml,xslt,replace,find,Html,Xml,Xslt,Replace,Find,我有这样一个XML文档: <xml> <item> <title>Article 1</title> <text><![CDATA[Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec lorem diam, eleifend sed mollis id, condimentum in velit. Sed sit amet erat a

我有这样一个XML文档:

<xml>
  <item>
    <title>Article 1</title>
    <text><![CDATA[Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec lorem diam, eleifend sed mollis id, condimentum in velit.

Sed sit amet erat ac mauris adipiscing elementum. Pellentesque eget quam augue, id faucibus magna.

Ut malesuada arcu eu elit sodales sodales. Morbi tristique porttitor tristique. Praesent eget vulputate dui. Cras ut tortor massa, at faucibus ligula.]]></text>
  </item>
</xml>
<xsl:template match="/">
        <html>
            <head>
                <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
                <title>Page title</title>
            </head>
            <body>
                <h1>Table of contents</h1>
                <ol>
                <xsl:for-each select="xml/item>
                        <li><xsl:value-of select="./title"/></li>
                </xsl:for-each>
                </ol>
                <hr/>
                <xsl:for-each select="xml/item">
                    <h2><xsl:value-of select="./title"/></h2>
                    <xsl:value-of select="./text" disable-output-escaping="yes"/>
                </xsl:for-each>
            </body>
        </html>
</xsl:template>

第一条
“段落”之间有空行

我需要使用XSLT转换,元素的每一段文本都在和之间。因此,我期望的输出如下所示:

<h2>Article 1</h2>    
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec lorem diam, eleifend sed mollis id, condimentum in velit.</p>
<p>Sed sit amet erat ac mauris adipiscing elementum. Pellentesque eget quam augue, id faucibus magna.</p>
<p>Ut malesuada arcu eu elit sodales sodales. Morbi tristique porttitor tristique. Praesent eget vulputate dui. Cras ut tortor massa, at faucibus ligula.</p>
第1条
Lorem ipsum dolor sit amet,是一位杰出的献身者。多奈克·洛雷姆·迪亚姆、埃利弗德·塞德·莫利斯、维利特调味品

这是一个非常重要的元素。佩伦特·奎姆·奥古斯,我是福西布斯·麦格纳

Ut malesuada arcu eu Elite sodales。莫比·特里斯蒂克·波特提托·特里斯蒂克。酒后驾车。克拉斯·乌特·托托·马萨,在福西布斯·利古拉

到目前为止,我有一个XSLT,如下所示:

<xml>
  <item>
    <title>Article 1</title>
    <text><![CDATA[Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec lorem diam, eleifend sed mollis id, condimentum in velit.

Sed sit amet erat ac mauris adipiscing elementum. Pellentesque eget quam augue, id faucibus magna.

Ut malesuada arcu eu elit sodales sodales. Morbi tristique porttitor tristique. Praesent eget vulputate dui. Cras ut tortor massa, at faucibus ligula.]]></text>
  </item>
</xml>
<xsl:template match="/">
        <html>
            <head>
                <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
                <title>Page title</title>
            </head>
            <body>
                <h1>Table of contents</h1>
                <ol>
                <xsl:for-each select="xml/item>
                        <li><xsl:value-of select="./title"/></li>
                </xsl:for-each>
                </ol>
                <hr/>
                <xsl:for-each select="xml/item">
                    <h2><xsl:value-of select="./title"/></h2>
                    <xsl:value-of select="./text" disable-output-escaping="yes"/>
                </xsl:for-each>
            </body>
        </html>
</xsl:template>

页面标题
目录

使用XSLT2.0,可以使用正则表达式标记字符串

为此,请将
替换为:

<xsl:analyze-string select="text" regex="&#xa;">
    <xsl:non-matching-substring>
        <p>
            <xsl:value-of select="."/>
        </p>
    </xsl:non-matching-substring>
</xsl:analyze-string>



在XSLT 1.0中,您必须定义一个模板,该模板将被递归调用,并在第一个换行之前为子字符串生成一个
元素。

如果必须使用XSLT 1.0,以下命名模板可以完成这项工作:

<xsl:template name="replace-nl">
  <xsl:param name="str"/>
  <xsl:if test="$str">
    <xsl:variable name="before" select="substring-before($str, '&#10;')"/>
    <xsl:variable name="after" select="substring-after($str, '&#10;')"/>      
    <p>
      <xsl:choose>
        <xsl:when test="$before">
          <xsl:value-of select="normalize-space($before)"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="normalize-space($str)"/>
        </xsl:otherwise>
      </xsl:choose>
    </p>
    <xsl:call-template name="replace-nl">
      <xsl:with-param name="str" select="$after"/>
    </xsl:call-template>
  </xsl:if>
</xsl:template>

谢谢你们两位!我用了第一个技巧,它马上就起作用了。