如何在保留文本的同时保留数据中的换行符,制表符和空格?

时间:2008-09-17 20:18:19

标签: xslt

我的XML数据包含我想要在输出HTML中保留的换行符,空格和制表符(因此我无法使用< p>)但我也希望这些行包裹在到达了屏幕(因此我无法使用< pre>)。

4 个答案:

答案 0 :(得分:1)

另一种方法是,您希望将所有空格对转换为两个不间断空格,将四个不间断空格分隔为四个不间断空格,将所有换行符转换为<br>元素。在XSLT 1.0中,我会这样做:

<xsl:template name="replace-spaces">
  <xsl:param name="text" />
  <xsl:choose>
    <xsl:when test="contains($text, '  ')">
      <xsl:call-template name="replace-spaces">
        <xsl:with-param name="text" select="substring-before($text, '  ')"/>
      </xsl:call-template>
      <xsl:text>&#xA0;&#xA0;</xsl:text>
      <xsl:call-template name="replace-spaces">
        <xsl:with-param name="text" select="substring-before($text, '  ')" />
      </xsl:call-template>
    </xsl:when>
    <xsl:when test="contains($text, '&#x9;')">
      <xsl:call-template name="replace-spaces">
        <xsl:with-param name="text" select="substring-before($text, '&#x9;')"/>
      </xsl:call-template>
      <xsl:text>&#xA0;&#xA0;&#xA0;&#xA0;</xsl:text>
      <xsl:call-template name="replace-spaces">
        <xsl:with-param name="text" select="substring-before($text, '&#x9;')" />
      </xsl:call-template>
    </xsl:when>
    <xsl:when test="contains($text, '&#xA;')">
      <xsl:call-template name="replace-spaces">
        <xsl:with-param name="text" select="substring-before($text, '&#xA;')" />
      </xsl:call-template>
      <br />
      <xsl:call-template name="replace-spaces">
        <xsl:with-param name="text" select="substring-after($text, '&#xA;')" />
      </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="$text" />
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

不能使用尾递归有点痛苦,但它不应该是一个真正的问题,除非文本非常长。

XSLT 2.0解决方案将使用<xsl:analyze-string>

答案 1 :(得分:0)

我和同事(Patricia Eromosele)提出了以下解决方案:(有更好的解决方案吗?)

    <p>
<xsl:call-template name="prewrap">
<xsl:with-param name="text" select="text"/>
</xsl:call-template>
</p>



<xsl:template name="prewrap">
<xsl:param name="text" select="."/>
<xsl:variable name="spaceIndex" select="string-length(substring-before($text, ' '))"/>
<xsl:variable name="tabIndex" select="string-length(substring-before($text, '&#x09;'))"/>
<xsl:variable name="lineFeedIndex" select="string-length(substring-before($text, '&#xA;'))"/>
<xsl:choose>
<xsl:when test="$spaceIndex = 0 and $tabIndex = 0 and $lineFeedIndex = 0"><!-- no special characters left -->
<xsl:value-of select="$text"/>
</xsl:when>
<xsl:when test="$spaceIndex > $tabIndex and $lineFeedIndex > $tabIndex"><!-- tab -->
<xsl:value-of select="substring-before($text, '&#x09;')"/>
<xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
<xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
<xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
<xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
<xsl:call-template name="prewrap">
<xsl:with-param name="text" select="substring-after($text,'&#x09;')"/>
</xsl:call-template>
</xsl:when>
<xsl:when test="$spaceIndex > $lineFeedIndex and $tabIndex > $lineFeedIndex"><!-- line feed -->
<xsl:value-of select="substring-before($text, '&#xA;')"/>
<br/>
<xsl:call-template name="prewrap">
<xsl:with-param name="text" select="substring-after($text,'&#xA;')"/>
</xsl:call-template>
</xsl:when>
<xsl:when test="$lineFeedIndex > $spaceIndex and $tabIndex > $spaceIndex"><!-- two spaces -->
<xsl:value-of select="substring-before($text, ' ')"/>
<xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
<xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
<xsl:call-template name="prewrap">
<xsl:with-param name="text" select="substring-after($text,' ')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise><!-- should never happen -->
<xsl:value-of select="$text"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>

来源:http://jamesjava.blogspot.com/2008/06/xsl-preserving-line-feeds-tabs-and.html

答案 2 :(得分:0)

真的,我会选择一个能够正确支持这种情况的编辑器,而不是通过更多的XML进行争论。

答案 3 :(得分:0)

不确定这是否相关,但是没有preservespace属性和xml的什么?