2012-04-07 147 views
2

XSL是爲了將XML轉換爲XML,但你可以將喜歡您可以使用XSL將行分隔列表轉換爲正確的xhtml列表嗎?

line1 
line 2 -- foo 
line 3 

文件到只使用XSLT

<ol> 
<li>line1</li> 
<li>line 2 -- foo</li> 
<li>line 3</li> 
</ol> 

+0

XSL 1個奧德XSL 2? – Lucero 2012-04-07 11:49:54

+0

@Lucero:現在,我正在使用'1',但是如果它只能在'2'中工作,那也可以。所以,基本上,這並不重要。 – bitmask 2012-04-07 11:51:34

回答

3

這是在XSLT 2.0簡單以及在XSLT 1.0不難:

I. XSLT 1.0溶液

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/*"> 
    <ol> 
    <xsl:apply-templates/> 
    </ol> 
</xsl:template> 

<xsl:template match="text()" name="linesToLi"> 
    <xsl:param name="pText" select="."/> 

    <xsl:if test="string-length($pText) > 0"> 
     <xsl:variable name="vthisLine" select= 
     "substring-before(concat($pText, '&#xA;'), '&#xA;')"/> 

     <li><xsl:value-of select="$vthisLine"/></li> 

     <xsl:call-template name="linesToLi"> 
     <xsl:with-param name="pText" select="substring-after($pText, '&#xA;')"/> 
     </xsl:call-template> 
    </xsl:if> 
</xsl:template> 
</xsl:stylesheet> 

當在下面的XML文檔被應用於這種轉變(提供的文本,包裝成單個頂部元素以形成格式良好的XML文檔):

<t>line1 
line 2 -- foo 
line 3</t> 

的希望,正確的結果產生

<ol> 
    <li>line1</li> 
    <li>line 2 -- foo</li> 
    <li>line 3</li> 
</ol> 

II。 XSLT 2.0解決方案

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:variable name="vText" as="xs:string"> 
line1 
line 2 -- foo 
line 3 
</xsl:variable> 

<xsl:template match="/"> 
    <ol> 
    <xsl:for-each select= 
     "tokenize($vText, '\r?\n')[normalize-space()]"> 
     <li><xsl:sequence select="."/></li> 
    </xsl:for-each> 
    </ol> 
</xsl:template> 
</xsl:stylesheet> 

當這種轉變是在任何XML文檔(未使用)應用,在想,正確的結果產生

<ol> 
    <li> line1</li> 
    <li> line 2 -- foo</li> 
    <li> line 3</li> 
</ol> 

請注意

使用XSLT 2.0函數unparsed-text()我們可以將任何文本文件處理爲一個字符串並將i分割t使用上面的代碼行。

更確切地說,我們會使用這樣的事情:

tokenize(unparsed-text($vSomeUrl), '\r?\n')[normalize-space()] 
1

不幸的是XSLT 1沒有高效的字符串處理和解析工具,所以它不適合這樣的任務(儘管它是可能)。

隨着XSLT 2的改變。例如參見this paper on XSLT 2 text parsing

+0

聽起來很徹底。謝謝:) – bitmask 2012-04-07 16:43:01

+1

@bitmask:實際上,即使在XSLT 1.0中,這個處理並不難。 – 2012-04-07 17:35:19

相關問題