我将以下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="/">
<rule>
<xsl:apply-templates select=".//condition" />
</rule>
</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>
<condition type="<xsl:value-of select="@type"/>"><br />
</condition>
</li>
</ul>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:2)
select=".//condition"
具有展平层次结构的效果,因为您将所有级别的所有condition
元素选择到单个列表中。相反,您需要首先将模板应用于顶级condition
:
<xsl:template match="/rule">
<rule>
<xsl:apply-templates select="condition" />
</rule>
</xsl:template>
然后让condition
模板通过将模板应用于自己的子项来处理递归,例如:
<xsl:template match="condition">
<ul>
<li>
<condition type="<xsl:value-of select="@type"/>"><br />
<xsl:apply-templates select="condition"/>
</condition>
</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)
}
}
巢以来都是技巧。