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>
?
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>
?
這是在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, '
'), '
')"/>
<li><xsl:value-of select="$vthisLine"/></li>
<xsl:call-template name="linesToLi">
<xsl:with-param name="pText" select="substring-after($pText, '
')"/>
</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()]
不幸的是XSLT 1沒有高效的字符串處理和解析工具,所以它不適合這樣的任務(儘管它是可能)。
隨着XSLT 2的改變。例如參見this paper on XSLT 2 text parsing。
聽起來很徹底。謝謝:) – bitmask 2012-04-07 16:43:01
@bitmask:實際上,即使在XSLT 1.0中,這個處理並不難。 – 2012-04-07 17:35:19
XSL 1個奧德XSL 2? – Lucero 2012-04-07 11:49:54
@Lucero:現在,我正在使用'1',但是如果它只能在'2'中工作,那也可以。所以,基本上,這並不重要。 – bitmask 2012-04-07 11:51:34