【问题标题】:Detecting if a node exists?检测节点是否存在?
【发布时间】:2011-06-24 08:21:26
【问题描述】:

我有一组名为 <testData> 的数据,其中包含许多节点。

如何检测节点是否存在?

我试过了

<xsl:if test="/testData">

<xsl:if test="../testData">

两者都不起作用。我确定这是可能的,但我不确定如何。 :P

对于上下文,XML 文件的布局是这样的

<overall>
 <body/>
 <state/>
 <data/>(the one I want access to
 </overall>

我目前在&lt;body&gt; 标签中,但我想在全球范围内访问它。 /overall/data 不应该工作吗?

编辑 2: 现在,我有一个数据索引,当将模板应用于正文中的标签时,我需要随时使用它。在正文中,我如何判断数据是否存在?有时会,有时不会。实在控制不了。 :)

【问题讨论】:

  • 您应该提供一个简洁的 XML 示例。您的问题 90% 在于滥用上下文。
  • 啊。我没有逃避我的代码。 :P
  • 取决于上下文节点。
  • “一个都不起作用” - 这是一个危险信号,上面写着“它在什么方面不起作用?”你有错误吗?结果不正确?如果是后者,预期结果和实际结果是什么?如果您使用以/ 开头的XPath 表达式,则结果不依赖于上下文节点(只要您在正确的文档中)。但是,如果不知道“它不起作用”是什么意思,就很难为您提供帮助。
  • xpath find if node exists的完全重复

标签: xslt xpath


【解决方案1】:

试试count(.//testdata) &amp;gt; 0

但是,如果您的上下文节点是 textdata 并且您想测试它是否有 somenode 子节点,我会写:

  <xsl:if test="somenode"> 
    ...
  </xsl:if>

但我认为这不是你真正想要的。我认为您应该阅读编写 XSLT 样式表的不同技术(推/拉处理等)。应用这些时,通常不需要这样的表达式,样式表会变得更简单。

【讨论】:

  • 空节点集的有效布尔值为false。没有 XSLT 程序员使用count() 函数来测试存在性。
  • @Alejandro,感谢您的指出。我已经三四年没有积极使用 XSLT 了。会努力赶上的:)
  • 就是这样!我试图用斜线test="/somenode" 来做,但由于某种原因它不能那样工作......
【解决方案2】:

这个 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

【讨论】:

  • 啊。我应该说标签都关闭了。查看我的最新编辑。 :)
  • 你的样本真的很奇怪。您需要匹配文本节点,它紧跟在data 元素之后?
  • 投反对票,尽管 OP 表示他在编辑中为这些标签添加了自动关闭功能。有些人只是无知。
【解决方案3】:

如果有人需要,这将适用于 XSL 1.0...

<xsl:choose>
    <xsl:when test="/testdata">node exists</xsl:when>
    <xsl:otherwise>node does not exists</xsl:otherwise>
</xsl:choose>

【讨论】:

    猜你喜欢
    • 2017-06-03
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 2019-08-01
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多