您可以使用XSL将行分隔列表转换为正确的xhtml列表吗?
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