使用xslt将xhtml转换为wiki语法

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)

对应于

  • 清单项目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>
Run Code Online (Sandbox Code Playgroud)

Dim*_*hev 5

以下转型:

<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('&#xA;',
               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)

请注意以下事项:

  1. 所需的缩进由值确定count(ancesstor::li).

  2. 缩进的空间直接取自足够大的空白行(包含20个嵌套级别的足够空白).有没有必要递归输出的空间逐一.

  3. 由于上述2. 转换效率更高.

  4. 注意使用XPath substring()函数.