当前位置 : 主页 > 网页制作 > html >

使用xslt将xhtml转换为wiki语法

来源:互联网 收集:自由互联 发布时间:2021-06-12
我想使用xslt将xhtml转换为dokuwiki语法. 现在,我似乎无法解决的一件事是如何处理嵌套列表. dokuwiki语法对列表项使用星号(*),每个嵌套级别(c.f. wiki syntax)前面有两个空格. 我的问题:在下面
我想使用xslt将xhtml转换为dokuwiki语法.

现在,我似乎无法解决的一件事是如何处理嵌套列表. 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('&#xA;',
               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()功能.

网友评论