使用XSLT移动元素

时间:2014-04-01 13:07:32

标签: html xml xslt

我需要将数万个XML文件转换为HTML5。

问题在于列表以及XML中的嵌套方式,因为它们需要以HTML格式嵌套。

以下是XML的外观:

<list>
    <item>1</item>
    <item>2</item>
    <list>
        <item>2.1</item>
        <list>
            <item>2.1.1</item>
            <item>2.1.2</item>
        </list>
        <item>2.2</item>
        <item>2.2</item>
    </list>
    <item>3</item>
    <item>4</item>
</list>

HTML应该如何(即ul嵌套在li内):

<ul>
    <li>1</li>
    <li>2
        <ul>
            <li>2.1
                <ul>
                    <li>2.1.1</li>
                    <li>2.1.2</li>
                </ul>
            </li>
            <li>2.2</li>
            <li>2.2</li>
        </ul>
    </li>
    <li>3</li>
    <li>4</li>
</ul>

我尝试过很多我在这里找到的例子,但是不能让他们为我工作。

复制元素正在运行但现在正在移动。而且我不知道如何删除&#34;复制的原始内容。

这就是我现在从转型中得到的结果:

<ul>
    <li>1</li>
    <li>2
        <ul>
            <li>2.1
                <ul>
                    <li>2.1.1</li>
                    <li>2.1.2</li>
                </ul>
            </li>
            <ul>
                <li>2.1.1</li>
                <li>2.1.2</li>
            </ul>
            <li>2.2</li>
            <li>2.2</li>
        </ul>
    </li>
    <ul>
        <li>2.1
            <ul>
                <li>2.1.1</li>
                <li>2.1.2</li>
            </ul>
        </li>
        <ul>
            <li>2.1.1</li>
            <li>2.1.2</li>
        </ul>
        <li>2.2</li>
        <li>2.2</li>
    </ul>
    <li>3</li>
    <li>4</li>
</ul>

修改

这是我使用过的xslt:

<xsl:template match="list">
    <ul>
        <xsl:apply-templates/>
    </ul>
</xsl:template>

<xsl:template match="item">
    <li>
        <xsl:apply-templates/>
        <xsl:if test="following-sibling::*[1][self::list]">
            <xsl:apply-templates select="following-sibling::list[1]"/>
        </xsl:if>
    </li>
</xsl:template>

1 个答案:

答案 0 :(得分:0)

使用

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output indent="yes" method="html" version="5.0"/>
<xsl:strip-space elements="*"/>

<xsl:template match="list">
  <ul>
    <xsl:apply-templates select="item"/>
  </ul>
</xsl:template>

<xsl:template match="item">
  <li>
    <xsl:apply-templates select="node() | following-sibling::*[1][self::list]"/>
  </li>
</xsl:template>

</xsl:stylesheet>

我得到您发布的输入结果。但我不确定它是否适用于更复杂的输入,您可能希望添加输入样本的变体。