我想使用xslt将xhtml转换为dokuwiki语法. 现在,我似乎无法解决的一件事是如何处理嵌套列表. dokuwiki语法对列表项使用星号(*),每个嵌套级别(c.f. wiki syntax)前面有两个空格. 我的问题:在下面
现在,我似乎无法解决的一件事是如何处理嵌套列表. dokuwiki语法对列表项使用星号(*),每个嵌套级别(c.f. wiki syntax)前面有两个空格.
我的问题:在下面的例子中,< xsl:template mach =“li”>如何?匹配列表项2.1.1要知道它的嵌套级别,以便预先添加适当数量的空格?
* list item 1 * list item 2 * list item 2.1 * list item 2.1.1 * list item 2.2 * list item 2.3 * list item 3
对应于
>清单项目1
>清单项目2
>清单项目2.1
>清单项目2.1.1
>清单项目2.2
>清单项目2.3
>清单项目3
这是以下html的显示方式:
<ul> <li> list item 1 </li> <li> list item 2 <ul> <li> list item 2.1 <ul> <li>list item 2.1.1</li> </ul> </li> <li>list item 2.2</li> <li>list item 2.3</li> </ul> </li> <li> list item 3 </li> </ul>以下转型:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text"/> <xsl:strip-space elements="*"/> <xsl:variable name="vBlanks" select="' '"/> <xsl:variable name="vnNestSpaces" select="2"/> <xsl:template match="li"> <xsl:variable name="vNestLevel" select="count(ancestor::li)"/> <xsl:value-of select= "concat('
', substring($vBlanks,1,$vnNestSpaces*$vNestLevel), '* ', normalize-space(text()[1]) )"/> <xsl:apply-templates select="*"/> </xsl:template> </xsl:stylesheet>
当应用于原始XML文档时:
<ul> <li> list item 1 </li> <li> list item 2 <ul> <li> list item 2.1 <ul> <li>list item 2.1.1</li> </ul> </li> <li>list item 2.2</li> <li>list item 2.3</li> </ul> </li> <li> list item 3 </li> </ul>
产生预期的结果:
* list item 1 * list item 2 * list item 2.1 * list item 2.1.1 * list item 2.2 * list item 2.3 * list item 3
请注意以下事项:
>所需的缩进由count(ancesstor :: li)的值决定.
>缩进的空间直接来自足够大的空白行(包含20个嵌套级别的足够空白).无需逐个递归地输出空格.
>由于上述2.转换效率更高.
>注意使用XPath substring()
功能.