XSLT - 添加 为文本字符串,而不是\\ñ(XSLT - add

into te

2019-09-17 08:23发布

我有一个这样的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>

那里有“段落”之间的空行。

和我需要使用XSLT转换,其中元件将具有<P>和</ P>之间文本的每个段落。 所以,我需要的输出会是这样:

<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>

到目前为止,我有一个XSLT看起来像这样:

<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>

如何应对的替换\n与段落的HTML标签正确的地方? 我在这里检查类似的问题,但我显然不能够实现他们对我的问题。

Answer 1:

使用XSLT 2.0,您可以使用正则表达式来标记你的字符串。

要做到这一点,你的替换<xsl:value-of>通过:

<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,你必须定义一个将被递归调用,并产生一个模板<p>元件,用于所述第一换行前的子字符串。



Answer 2:

如果你必须使用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>

只需调用它,而不是xsl:value-of要被替换的换行字符,例如:

<xsl:for-each select="xml/item">
  ...
  <xsl:call-template name="replace-nl">
    <xsl:with-param name="str" select="text"/>
  </xsl:call-template>                    
</xsl:for-each>


文章来源: XSLT - add

into text strings instead of \\n