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

Ric*_*d N 15 xml xslt xpath

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

这是我拥有的XML类型:

<Employee>
    <Summary>
        <A>
        <B>
    </Summary>
    <Elections>
    </Elections>
<Employee>
Run Code Online (Sandbox Code Playgroud)

我需要编写一个Xpath条件,如下所示:

if (NOT(the following sibling(first sibling) of /Employee/Summary is Elections)), then do something.
Run Code Online (Sandbox Code Playgroud)

目前我有:

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

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

Mad*_*sen 33

你走在正确的轨道上.的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>
Run Code Online (Sandbox Code Playgroud)