我有 XML 中的数据,其中包含我想在输出 HTML 中保留的换行符、空格和制表符(所以我不能使用 <p>),但我还希望在到达屏幕一侧时换行(所以我不能使用 <pre>)。
James A. N. Stauffer
问问题
5548 次
4 回答
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>  </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, '	')">
<xsl:call-template name="replace-spaces">
<xsl:with-param name="text" select="substring-before($text, '	')"/>
</xsl:call-template>
<xsl:text>    </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, '
')">
<xsl:call-template name="replace-spaces">
<xsl:with-param name="text" select="substring-before($text, '
')" />
</xsl:call-template>
<br />
<xsl:call-template name="replace-spaces">
<xsl:with-param name="text" select="substring-after($text, '
')" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
不能使用尾递归有点痛苦,但除非文本很长,否则它不应该是一个真正的问题。
XSLT 2.0 解决方案将使用<xsl:analyze-string>
.
于 2008-09-18T13:51:18.633 回答
0
不确定这是否相关,但没有preservespace 属性和xml 之类的吗?
于 2008-09-17T20:32:09.397 回答
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, ' '))"/>
<xsl:variable name="lineFeedIndex" select="string-length (substring-before($text, ' '))"/>
<xsl:choose>
<xsl:when test="$spaceIndex = 0 and $tabIndex = 0 and $lineFeedIndex = 0"><!-- 没有特殊字符-->
<xsl:value-of select="$text"/>
</xsl:when>
<xsl:when test="$spaceIndex > $tabIndex and $lineFeedIndex > $tabIndex"><!-- tab -->
<xsl :value-of select="substring-before($text, ' ')"/>
<xsl:text disable-output-escaping="yes"> </xsl:text>
<xsl :text disable-output-escaping="yes"> </xsl:text>
<xsl:text disable-output-escaping="yes"> </xsl:text>
<xsl:text disable-output-escaping="yes"> </xsl:text>
<xsl:call-template name="prewrap">
<xsl:with-param name="text" select="substring-after($text,' ')"/>
</xsl:call-template>
</xsl:when>
<xsl:when test="$spaceIndex > $lineFeedIndex and $tabIndex > $lineFeedIndex"><!-- 换行 -->
<xsl:value-of select="substring-before($text, ' ')"/>
<br/>
<xsl:call-template name="prewrap">
<xsl:with-param name="text" select="substring-after($text,' ')" />
</xsl:call-template>
</xsl:when>
<xsl:when test="$lineFeedIndex > $spaceIndex and $tabIndex > $spaceIndex"><!-- 两个空格 -->
<xsl:value-的 select="substring-before($text, ' ')"/>
<xsl:text disable-output-escaping="yes"> </xsl:text>
<xsl:text disable-output-escaping="yes"> </xsl:text>
<xsl:call-template name="prewrap">
<xsl:with-param name="text" select="substring-after($text,' ')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise><!--永远不会发生 -->
<xsl:value-of select="$text"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
来源:http: //jamesjava.blogspot.com/2008/06/xsl-preserving-line-feeds-tabs-and.html
于 2008-09-17T20:20:40.517 回答
0
真的,我会选择一个正确支持这一点的编辑器,而不是通过更多的 XML 来解决它。
于 2008-09-17T20:25:03.780 回答