У вас есть два шаблона в начале вашего XSLT
<xsl:template match="Nodes[TreeNode]">
<xsl:apply-templates select="TreeNode" />
</xsl:template>
<xsl:template match="Nodes[not(TreeNode)]" />
Они могут быть объединены в один;вот так:
<xsl:template match="Nodes">
<xsl:apply-templates select="TreeNode" />
</xsl:template>
Причина в том, что если Nodes
не имеет TreeNode
, то <xsl:apply-templates select="TreeNode" />
ничего не выберет, так что эффект тот же.(На самом деле, вы можете полностью удалить этот шаблон, если Nodes
может содержать только TreeNode
, поскольку встроенные шаблоны XSLT будут делать то же самое).
Однако, в ответ на вашу проблемуЭто то, что я думаю, что вам нужен еще один шаблон, который вам нужен другой шаблон, который соответствует Nodes
в случае, когда есть дочерний TreeNode
для «Данные»
<xsl:template match="Nodes[TreeNode/Style='Data']">
<table>
<xsl:apply-templates select="TreeNode" />
</table>
</xsl:template>
Попробуйте этот XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:strip-space elements="*" />
<xsl:template match="Nodes[TreeNode/Style='Data']">
<table>
<xsl:apply-templates select="TreeNode" />
</table>
</xsl:template>
<xsl:template match="Nodes">
<xsl:apply-templates select="TreeNode" />
</xsl:template>
<xsl:template match="TreeNode[Style='Data']">
<tr>
<td>
<xsl:value-of select="Value"/>
</td>
</tr>
</xsl:template>
<xsl:template match="TreeNode[Style='Group']">
<group>
<p>
<xsl:value-of select="Label"/>
</p>
<xsl:apply-templates select="Nodes" />
</group>
</xsl:template>
</xsl:stylesheet>