2017-05-22 57 views
1

我有下面的XML:新線到HTML換行符使用XSLT

<RichText> 
    Text 
    Text 
    Text 
</RichText> 

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

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

<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> 

此輸出:

我使用下面的XSL它靠攏試圖

<p><br>     
    Text<br>     
    Text<br>     
    Text<br> 
<br></p> 
+2

你能解釋的標準時,換行字符時不進行改造,以'br'元素?您已經舉了一個例子,但可能以純文本形式制定標準有助於您編寫XSLT檢查,或者允許我們幫助您編寫它們。 –

+0

如果在這些「文本」行之間有空行,您希望輸出什麼樣的輸出? –

回答

3

爲了您的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> 
0

嘗試下面的腳本:

<?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解決方案:

  • 符號化,
  • 子,
  • 和修整。