我想使用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()功能.
