如何知道何时将结束标记放在嵌套元素

时间:2015-06-02 15:43:53

标签: html xml xslt

我将以下xml转换为html:

<rule>
    <condition type="AND">
        <condition type="AND">
            <condition type="NOT">
            </condition>
        </condition>
    </condition>
</rule>

从这个结构中,你可以推断条件可以有其他条件(或不是最后一个条件)。

我试图在html中创建相同的结构,并且不确定何时/如何/在何处将结束标记放在具有条件的条件中。这是我目前得到的输出,但我希望它是上面的输出:

<rule>
    <condition type="AND">
    </condition> 
        <condition type="AND">
        </condition> 
            <condition type="NOT">
            </condition> 
</rule>

这是我的xsl:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" />
    <xsl:template match="/">
        &lt;rule&gt;
        <xsl:apply-templates select=".//condition" />
        &lt;/rule&gt;
    </xsl:template>
    <xsl:template match="condition">
        <xsl:variable name="margin-left"><xsl:number value="(count(ancestor::condition) + 1) * 20" />px</xsl:variable>
        <ul class="list-unstyled" style="margin:0px;margin-left:{$margin-left}">
            <li>
                &lt;condition type="<xsl:value-of select="@type"/>"&gt;<br />
                &lt;/condition&gt;
            </li>
        </ul>
    </xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:2)

select=".//condition"具有展平层次结构的效果,因为您将所有级别的所有condition元素选择到单个列表中。相反,您需要首先将模板应用于顶级condition

<xsl:template match="/rule">
    &lt;rule&gt;
    <xsl:apply-templates select="condition" />
    &lt;/rule&gt;
</xsl:template>

然后让condition模板通过将模板应用于自己的子项来处理递归,例如:

<xsl:template match="condition">
    <ul>
        <li>
            &lt;condition type="<xsl:value-of select="@type"/>"&gt;<br />
            <xsl:apply-templates select="condition"/>
            &lt;/condition&gt;
        </li>
    </ul>
</xsl:template>

(我省略了样式部分,一旦你有了使用递归的概念,你可以在你的完整样式表中对它自己进行排序 - 事实上,如果你使用填充而不是边距,你可能不需要整个祖先的计数自上一个ul巢中的每个package com.myStuff import org.codehaus.groovy.grails.exceptions.DefaultStackTracePrinter class MyStackTracePrinter extends DefaultStackTracePrinter { String prettyPrint(Throwable throwable) { if (throwable instanceof MyException) return "<stack trace suppressed>" return super.prettyPrint(throwable) } } 巢以来都是技巧。