我有XML格式的數據,我想在輸出HTML中保留換行符,空格和製表符(所以我不能使用<p>),但我也希望在屏幕的一側顯示換行(所以我不能使用<pre>)。如何在保留包裝文本的同時保留數據中的換行符,製表符和空格?
2
A
回答
0
我和一個同事(帕特里夏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"><!-- 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, '	')"/>
<xsl:text disable-output-escaping="yes">&nbsp;</xsl:text>
<xsl:text disable-output-escaping="yes">&nbsp;</xsl:text>
<xsl:text disable-output-escaping="yes">&nbsp;</xsl:text>
<xsl:text disable-output-escaping="yes">&nbsp;</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"><!-- line feed -->
<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"><!-- two spaces -->
<xsl:value-of select="substring-before($text, ' ')"/>
<xsl:text disable-output-escaping="yes">&nbsp;</xsl:text>
<xsl:text disable-output-escaping="yes">&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
0
真的,我會選擇一個它正確地支持這一點,而不是通過更多的XML來爭論它。
0
不知道這是否相關,但不是有一個preservespace屬性和什麼不適用於XML?
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>
。
+0
更正:你的代碼中有兩個substring-before應該是substring-after。 – MrFox 2009-03-23 11:30:45
相關問題
- 1. 在保留換行符的同時修剪空格
- 2. 如何保留換行符
- 3. 在保留換行符和段落結構的同時保留標記
- 4. 替換換行符,但保留空行
- 5. 回聲ps,同時保留換行符?
- 6. 在mysql中保存textarea中的文本時如何保留換行符?
- 7. 如何在Jsoup中保留換行符?
- 8. 在保留url的同時在Rails中包裝長字符串?
- 9. HTML文本框保留換行符
- 10. 如何限制字符但保留換行符/格式?
- 11. 替換字符串,但保留空格
- 12. Regex.Split()在保留空格的同時保留單詞
- 13. 如何在保留換行符的同時整理一些XML?
- 14. 編輯XML文件,並保留空格和製表符
- 15. 如何連接MSBuild中的文件並保留製表符和空格
- 16. 如何保留textarea和數據庫之間的換行符?
- 17. 如何複製Excel文本並保留換行符
- 18. 如何刪除虛假的非ASCII字符,但保留空格和換行符?
- 19. Python在字符串中保留空格
- 20. Java在空格處拆分字符串但保留製表符
- 21. 屏蔽字符串時保留空格
- 22. 在Textarea和MySQL上保留換行符
- 23. gofmt保留換行符
- 24. 保留與htmlentities換行符?
- 25. File.WriteAllText不保留換行符
- 26. 從字符串中提取數字,同時保留空格
- 27. 如何在剝離空行時保留AWK中的前導製表符?
- 28. 保留製表符後.split()
- 29. 複製按鈕保留換行符
- 30. 如何保留textarea表單文章中的空格和格式?
我正在使用XSLT將XML轉換爲HTML,因此不使用編輯器。 – 2008-09-17 20:27:36