Мне нужен был аналогичный XSLT, но с неизвестной глубиной, вот как я это сделал.
Сначала добавьте обертку для результирующего списка таблиц HTML / def и вызовите шаблон mode = "puke", чтобы выровнять наше дерево XML:
<xsl:element name="div">
<xsl:attribute name="class" select="puke" />
<xsl:apply-templates select="$notice" mode="puke" />
</xsl:element>
Здесь мы сопоставляем каждый узел для отображения его содержимого (например, text ()) и его атрибутов. Мы делаем это рекурсивно. Я использовал dl / dt / dd, потому что мое исходное дерево было сложным деревом, которое не может быть сплющено как.
<!-- @description:
Display all field from the notice so the customer can tell what he want
-->
<xsl:template match="node()" mode="puke">
<xsl:message>
puking : <xsl:value-of select="local-name( . )" />
</xsl:message>
<xsl:element name="dl">
<xsl:element name="dt">
<xsl:attribute name="class">tagName</xsl:attribute>
<xsl:value-of select="local-name( . )" />
</xsl:element>
<xsl:element name="dd">
<xsl:attribute name="class">tagText</xsl:attribute>
<xsl:value-of select="text()" /></xsl:element>
<xsl:element name="dl">
<xsl:attribute name="class">attr</xsl:attribute>
<!-- display attribute -->
<xsl:apply-templates select="@*" />
</xsl:element>
</xsl:element>
<!-- recursive call on node() -->
<xsl:apply-templates select="./*" mode="puke" />
</xsl:template>
Соответствует атрибуту данного узла и отображает их.
Использование CSS для форматирования полученного HTML:
<style>
.puke {
background-color: #BDD6DE;
clear: both;
}
.tagName, .attrName {
float: left;
}
.tagText, .attrText {
clear: right;
}
</style>