【问题标题】:Simple preceding-sibling select returns unexpected results简单的前同级选择返回意外结果
【发布时间】:2018-09-04 11:22:58
【问题描述】:

我正在尝试在 BaseX 上学习 XPath/XQuery。 XPath 查询返回一些我无法解释的结果。

输入 XML:

<?xml version="1.0" encoding="UTF-8"?>
<manual>
<chapter>
<section>
        <itemizedlist type="Ordered" mark="1">
            <listitem>
                <para/>
            </listitem>
            <listitem>
                <para/>
            </listitem>
        </itemizedlist>
        <CWD>
            <para>1</para>
        </CWD>
        <para/>
        <CWD>
            <para>2</para>
        </CWD>
        <para/>
        <itemizedlist>
            <listitem>
                <para/>
            </listitem>
            <listitem>
                <para/>
            </listitem>
        </itemizedlist>
        <CWD>
            <para>3</para>
        </CWD>
        <para/>
        <itemizedlist>
            <listitem>
                <para/>
            </listitem>
            <listitem>
                <para/>
            </listitem>
        </itemizedlist>
        </section>
    </chapter>  
</manual>

XPath:

//CWD[preceding-sibling::itemizedlist[1]]

预期结果:CWD 元素紧跟在 itemizedlist 之前,因此:

<CWD>
    <para>1</para>
</CWD>
<CWD>
    <para>3</para>
</CWD>

实际结果:

<CWD>
    <para>1</para>
</CWD>
<CWD>
    <para>2</para>
</CWD>
<CWD>
    <para>3</para>
</CWD>

为什么查询返回 CWD 2,我如何误用了前面的兄弟轴?

【问题讨论】:

    标签: xml xpath xquery basex


    【解决方案1】:

    使用//CWD[preceding-sibling::*[1][self::itemizedlist]] 来检查前面的同级元素是否是itemizedlist 元素。

    【讨论】:

    • 稍微扩展一下:谓词 X[preceding-sibling::Y[1]] 测试是否存在名为 Y 的前面的兄弟(它实际上测试是否存在名为 Y 的前面的第一个兄弟,但如果存在任何这样的兄弟,则有必须是第一个)。相比之下,谓词 X[preceding-sibling::*[1][self::Y] 找到第一个前面的兄弟元素(具有任何名称),然后测试它是否命名为 Y。
    猜你喜欢
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多