以下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中在路径中使用括号是无效的。
答案 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)