代码之家  ›  专栏  ›  技术社区  ›  James A. N. Stauffer

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

  •  2
  • James A. N. Stauffer  · 技术社区  · 17 年前

    我有XML格式的数据,其中有换行符、空格和制表符,我想保留在输出HTML中(因此我无法使用<p>),但我也希望在到达屏幕一侧时换行(因此我无法使用<pre>)。

    4 回复  |  直到 17 年前
        1
  •  1
  •   Richard    17 年前

    另一种方法是将所有的空格对转换为两个不间断的空格,将制表符转换为四个不间断的空格,并将所有的换行符转换为 <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> .

        2
  •  0
  •   Alexandra Franks    17 年前

    实际上,我会选择一个正确支持这一点的编辑器,而不是通过更多的xml来对其进行争论。

        3
  •  0
  •   James A. N. Stauffer    17 年前

    我和一位同事(帕特里夏·埃罗莫塞勒)提出了以下解决方案:(有更好的解决方案吗?)

        <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

        4
  •  0
  •   RWendi    17 年前

    不确定这是否相关,但是否有preserveSpace属性以及XML的其他特性?