【问题标题】:New Lines to HTML Line Breaks Using XSLT使用 XSLT 的 HTML 换行符的新行
【发布时间】:2017-05-22 16:07:28
【问题描述】:

我有以下 XML:

<RichText>
    Text
    Text
    Text
</RichText>

我想使用 XSLT 1.0 输出以下 HTML(如果我真的需要,可以使用 2.0):

<p>
    Text<br/>
    Text<br/>
    Text
</p>

我尝试使用以下接近的 XSL:

<xsl:template match="text()">
  <xsl:param name="text" select="."/>

  <!-- Because we would rely on $text containing a line break when using 
      substring-before($text,'&#10;') and the last line might not have a
      trailing line break, we append one before doing substring-before().  -->
  <xsl:value-of select="substring-before(concat($text,'&#10;'),'&#10;')"/>
  <br/>

  <xsl:if test="contains($text,'&#10;')">
    <xsl:apply-templates select=".">
      <xsl:with-param name="text" select="substring-after($text,'&#10;')"/>
    </xsl:apply-templates>
  </xsl:if>
<xsl:template>

这个输出:

<p><br>                  
    Text<br>                  
    Text<br>                  
    Text<br>
<br></p>

【问题讨论】:

  • 您能解释一下何时将换行符转换为br 元素以及何时不转换的标准吗?您已经给出了一个示例,但也许以纯文本形式制定标准有助于您编写 XSLT 检查或允许我们帮助您编写它们。
  • 如果Text 行之间有空行,你想要什么样的输出?

标签: html xml xslt line-breaks


【解决方案1】:

对于您的 XSLT 1.0 解决方案,我认为您只需要一些 xsl:if 测试来测试您正在处理的当前行之前和之后是否有非空白文本。

试试这个 XSLT

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

<xsl:template match="RichText">
  <p><xsl:apply-templates /></p>
</xsl:template>

<xsl:template match="text()">
   <xsl:param name="text" select="."/>

   <xsl:variable name="startText" select="substring-before(concat($text,'&#10;'),'&#10;')" />
   <xsl:variable name="nextText" select="substring-after($text,'&#10;')"/>
   <xsl:if test="normalize-space($startText)">
       <xsl:value-of select="$startText"/>
      <xsl:if test="normalize-space($nextText)">
         <br />
      </xsl:if>
   </xsl:if>

   <xsl:if test="contains($text,'&#10;')">
      <xsl:apply-templates select=".">
         <xsl:with-param name="text" select="$nextText"/>
      </xsl:apply-templates>
   </xsl:if>
</xsl:template>
</xsl:stylesheet>

【讨论】:

    【解决方案2】:

    试试下面的脚本:

    <?xml version="1.0" encoding="UTF-8" ?>
    <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
      <xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
    
      <xsl:template match="RichText">
        <p>
          <xsl:variable name="txt" select="tokenize(., '&#xA;')"/>
          <xsl:variable name="len" select="count($txt)"/>
          <xsl:for-each select="subsequence($txt, 2, $len - 2)">
            <xsl:value-of select="replace(replace(.,'\s+$',''),'^\s+','')"/>
            <xsl:if test="position() &lt; last()">
              <xsl:text disable-output-escaping="yes">&lt;br/&gt;</xsl:text>
            </xsl:if>
            <xsl:text>&#xA;</xsl:text>
          </xsl:for-each>
        </p>
      </xsl:template>
    
    </xsl:transform>
    

    我使用 XSLT 2.0,作为一个更易于编写的版本。

    可以使用 XSLT 1.0 重写它,但您必须使用等效的 1.0 解决方案:

    • 标记化,
    • 子序列,
    • 和修剪。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-06
      • 1970-01-01
      • 2017-03-04
      • 2013-06-29
      • 2021-09-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多