Xpath / XSLT:检查以下兄弟是否是特定节点

时间:2011-09-28 22:42:02

标签: xml xslt xpath

我已经看到了基于节点值应用了follow-sibling的问题,但我的问题与实际节点本身有关。

这是我所拥有的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>

请注意,我没有检查节点值,而是检查节点本身(即节点名称)。 我们非常感谢任何正确方向的帮助。

2 个答案:

答案 0 :(得分:31)

你走在正确的轨道上。 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>

答案 1 :(得分:3)

  

我需要编写一个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表达式选择任何Elections元素,该元素是任何Summary元素的第一个follow-sibling元素,它是顶层的子元素元素Employee

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