Pie*_*ing 3 xslt syntax xhtml wiki
我想使用xslt将xhtml转换为dokuwiki语法.
现在,我似乎无法解决的一件事是如何处理嵌套列表.dokuwiki语法对列表项使用星号(*),每个嵌套级别前面有两个空格(cf wiki语法).
我的问题:在下面的例子中,与列表项2.1.1匹配的<xsl:template mach ="li">如何知道它的嵌套级别,以便预先添加适当数量的空格?
* 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
Run Code Online (Sandbox Code Playgroud)
对应于
这是以下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>
Run Code Online (Sandbox Code Playgroud)
以下转型:
<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>
Run Code Online (Sandbox Code Playgroud)
当应用于原始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>
Run Code Online (Sandbox Code Playgroud)
产生预期的结果:
* 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
Run Code Online (Sandbox Code Playgroud)
请注意以下事项:
所需的缩进由值确定count(ancesstor::li)
.
缩进的空间直接取自足够大的空白行(包含20个嵌套级别的足够空白).有没有必要递归输出的空间逐一.
由于上述2. 转换效率更高.
注意使用XPath substring()
函数.