15
<node>
   <node1><node11/></node1>
   <node2/>
</node>

我希望我的 XSLT 检查

<xsl:if test="If at least 1 child node exists">
  Only node1 can pass the if condition
</xsl:if>

感谢您的回复。

4

4 回答 4

28

首先,请注意此处的术语。你的意思是“节点”还是“元素”。节点可以是元素、注释、文本或处理指令。

无论如何,如果您在这里确实是指元素,要检查至少存在一个子元素,您可以这样做(假设在这种情况下您位于节点元素上。

<xsl:if test="*">

您的评论表明只有“node1”可以通过 if 条件,因此要检查特定元素的存在,请执行此操作

<xsl:if test="node1">
于 2013-01-21T09:16:44.817 回答
8

在您正在测试的节点的上下文中,这应该可以测试节点是否具有子元素

<xsl:if test="*">
  Only node1 can pass the if condition
</xsl:if>

如果您实际上是指节点(包括文本节点),那么这将适用于包括文本节点:

<xsl:if test="node()">
  Only node1 can pass the if condition
</xsl:if>

<node>也会通过这个测试(<node2>不会)。我以为您只是在 's 子节点的上下文中说话<node>,但也许不是?

于 2013-01-21T09:16:46.210 回答
0

匹配节点的表达式是真的,而不匹配任何东西的表达式是假的,所以:

<xsl:if test="node()">
   ...
</xsl:if>

但是,您的问题和隐含条件“只有 node1 可以通过 if 条件”与示例不一致。两者node都有node1子节点,所以两者都会通过这个 if 条件。

要将其严格限制为node1,您必须确保模板上下文是适当的,或者检查有问题的节点不是 documentElement。

于 2013-01-21T09:23:16.363 回答
0

问题的措辞尚不清楚,但我认为您只想处理自己有子节点的子节点(即当前节点的孙子节点)

<xsl:template match="node">
 do stuff for node
  <xsl:apply-templates select="*[*]"/>
</xsl:template>

只会将模板应用于它,node1因为它有一个子节点,它不会将模板应用于node2.

于 2013-01-21T20:55:16.807 回答