我有一组名为<testData>
的数据,其中包含许多节点。
如何检测节点是否存在?
我试过
<xsl:if test="/testData">
和
<xsl:if test="../testData">
两者都不起作用。我确信这是可能的,但我不确定如何。 :P
对于上下文,XML文件的布局如下
<overall>
<body/>
<state/>
<data/>(the one I want access to
</overall>
我目前在<body>
标签中,但我想全局访问它。 /overall/data
不应该有用吗?
编辑2: 现在我有一个数据索引,我需要在将模板应用到body内部的标签时随时使用。在身体中,如何判断数据是否存在?有时确实如此,有时却没有。无法真正控制那个。 :)
答案 0 :(得分:8)
试试count(.//testdata) > 0
。
但是,如果你的上下文节点是textdata
并且你想测试它是否有somenode
孩子,我会写:
<xsl:if test="somenode">
...
</xsl:if>
但我认为这不是你真正想要的。我想你应该阅读编写XSLT样式表的不同技术(推/拉处理等)。在应用这些表达式时,通常不需要这样的表达式,并且样式表变得更加简单。
答案 1 :(得分:3)
这个XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="text()"/> <!-- for clarity only -->
<xsl:template match="body">
<xsl:if test="following-sibling::data">
<xsl:text>Data occurs</xsl:text>
</xsl:if>
<xsl:if test="not(following-sibling::data)">
<xsl:text>No Data occurs</xsl:text>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
应用于此示例:
<overall>
<body/>
<state/>
<data/>(the one I want access to
</overall>
将产生正确的结果:
Data occurs
应用于此样本时:
<overall>
<body/>
<state/>
</overall>
结果将是:
No Data occurs
答案 2 :(得分:3)
如果有人需要,这将适用于XSL 1.0。
<xsl:choose>
<xsl:when test="/testdata">node exists</xsl:when>
<xsl:otherwise>node does not exists</xsl:otherwise>
</xsl:choose>