使用XPath 1.0避免在路径中加上括号

时间:2019-04-03 17:25:27

标签: xpath xpath-1.0

以下XML结构表示一个包含许多文章的网站。除其他事项外,每篇文章都包含其创建日期,并且可能包含任意多个修改日期。我想使用XPath 1.0获取对每篇文章的最后访问日期(创建或最后修改)。

<website>
    <article>
        <date><strong>22.11.2017</strong></date>
        <edits>
            <edit><strong>17.12.2017</strong></edit>
        </edits>
    </article>
    <article>
        <date><strong>17.4.2016</strong></date>
        <edits></edits>
    </article>
    <article>
        <date><strong>3.5.2011</strong></date>
        <edits>
            <edit><strong>4.5.2011</strong></edit>
            <edit><strong>12.8.2012</strong></edit>
        </edits>
    </article>
    <article>
        <date><strong>12.2.2009</strong></date>
        <edits></edits>
    </article>
    <article>
        <date><strong>23.11.1987</strong></date>
        <edits>
            <edit><strong>3.4.2001</strong></edit>
            <edit><strong>11.5.2006</strong></edit>
            <edit><strong>13.9.2012</strong></edit>
        </edits>
    </article>
</website>

换句话说,预期的输出是:

<strong>17.12.2017</strong>
<strong>17.4.2016</strong>
<strong>12.8.2012</strong>
<strong>12.2.2009</strong>
<strong>13.9.2012</strong>

到目前为止,我仅创建了以下路径:

//article/*[self::date or self::edits/edit][last()]

在每个date中寻找edits和非空article节点,然后选择后者。但是我不知道如何访问每个这样的选择中的最新strong,并且追加到路径末尾的幼稚//strong[last()]也不起作用。

我在XPath 2.0中找到了解决方案。如果我没有记错的话,这些路径中的任何一条都应该起作用:

//article/(*[self::date or self::edits/edit][last()]//strong)[last()]
//article/(*//strong)[last()]

虽然在XPath 1.0中在路径中使用括号是无效的。

2 个答案:

答案 0 :(得分:1)

此XPath 1.0表达式

/website/article/descendant::strong[parent::date|parent::edit][last()]

选择节点:

<strong>17.12.2017</strong>

<strong>17.4.2016</strong>

<strong>12.8.2012</strong>

<strong>12.2.2009</strong>

<strong>13.9.2012</strong>

经过http://www.xpathtester.com/xpath/56d8f7bc4b9c8c064fdad16f22469026

的测试

注意:位置谓词作用于上下文列表。

答案 1 :(得分:1)

这是获取输出的简单xpath。

firebase.firestore()
        .collection('supervisorRequests')
        .doc(this.props.supervisorKey)