【问题标题】:Xpath/XSLT : check if following sibling is a particular nodeXpath/XSLT : 检查以下兄弟节点是否为特定节点
【发布时间】:2011-09-28 22:42:01
【问题描述】:

我看到了基于节点值应用跟随兄弟的问题,但我的问题与实际节点本身有关。

这是我拥有的 XML 类型:

<Employee>
    <Summary>
        <A>
        <B>
    </Summary>
    <Elections>
    </Elections>
<Employee>

我需要写一个Xpath条件如下:

if (NOT(the following sibling(first sibling) of /Employee/Summary is Elections)), then do something.

目前我有:

<xsl:if test="(not(following-sibling::Employee/Summary[1]='Earnings'))
    <xsl:call-template name="EmployeeRecord"/>
</xsl:if>

请注意,我检查的不是节点值,而是节点本身(即节点名称)。 任何正确方向的帮助将不胜感激。

【问题讨论】:

  • 当前节点是什么?概述的条件与您当前的 xslt 完全不符。您能用文字说明您在文档中的位置以及您想要实现的目标吗?

标签: xml xslt xpath


【解决方案1】:

你在正确的轨道上。 following-sibling 轴从上一步中的上下文节点计算。

  • 如果您要查找的第一个元素是 /Employee/Summary 的以下同级元素,您可以使用:/Employee/Summary/following-sibling::*[1]

  • 为了评估第一个后续兄弟是否是 Elections 元素,您可以使用额外的谓词过滤器 [self::Elections]

  • 测试是否定的,将整个东西包裹在not()

把它们放在一起,调整你的例子:

<xsl:if test="not(/Employee/Summary/following-sibling::*[1][self::Elections])">
    <xsl:call-template name="EmployeeRecord"/>
</xsl:if>

【讨论】:

  • 我之前没见过self 部分,所以对于像我这样的其他人来说,使用命名空间(ns)是:[self::ns:Elections]
【解决方案2】:

我需要写一个Xpath条件如下:

if (NOT(the following sibling(first sibling) of /Employee/Summary is Elections)), then do something.

使用

not(/Employee/Summary/following-sibling::*[1][self::Elections])

指定为not() 函数参数的XPath 表达式选择作为顶部元素Employee 的子元素的任何Summary 元素的第一个后续兄弟元素的任何Elections 元素。

如果这没有选择任何节点,那么上面的 XPath 表达式的计算结果为 true()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多