检测节点是否存在?

时间:2011-02-09 18:24:34

标签: xslt xpath

我有一组名为<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内部的标签时随时使用。在身体中,如何判断数据是否存在?有时确实如此,有时却没有。无法真正控制那个。 :)

3 个答案:

答案 0 :(得分:8)

试试count(.//testdata) &gt; 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>