xpath - 如何使用 XPath 比较多个节点
问题描述
鉴于下面的 XML,我正在尝试编写一个仅返回此匹配项的 XPath:
<TOKEN BEGIN="17" END="19" SENTENCE_BEGIN="0" SENTENCE_END="156" PROP="C" DOUBLE="YES" />
这是输入文件:
<?xml version="1.0" encoding="utf-8"?>
<DOCUMENT>
<SECTION>
<PARAGRAPH TRACK="4">
<SENTENCE NAME="PRIMARY" COUNT="4">
<TOKEN BEGIN="9" END="11" SENTENCE_BEGIN="0" SENTENCE_END="156" />
<TOKEN BEGIN="32" END="37" SENTENCE_BEGIN="0" SENTENCE_END="156" />
<TOKEN BEGIN="167" END="169" SENTENCE_BEGIN="158" SENTENCE_END="316" />
<TOKEN BEGIN="210" END="215" SENTENCE_BEGIN="158" SENTENCE_END="316" />
</SENTENCE>
<SENTENCE NAME="SECONDARY" COUNT="2">
<TOKEN BEGIN="139" END="141" SENTENCE_BEGIN="0" SENTENCE_END="156" PROP="A" DOUBLE="YES" />
<TOKEN BEGIN="143" END="145" SENTENCE_BEGIN="0" SENTENCE_END="156" PROP="B" />
</SENTENCE>
<SENTENCE NAME="SECONDARY" COUNT="1">
<TOKEN BEGIN="17" END="19" SENTENCE_BEGIN="0" SENTENCE_END="156" PROP="C" DOUBLE="YES" />
</SENTENCE>
</PARAGRAPH>
</SECTION>
</DOCUMENT>
这是我的 xpath 字符串:
//TOKEN [@DOUBLE] [@BEGIN <= ../../SENTENCE[@NAME='PRIMARY']/TOKEN/@END] [ (@SENTENCE_BEGIN = ../../SENTENCE[@NAME='PRIMARY']/TOKEN/@SENTENCE_BEGIN) and (@SENTENCE_END = ../../SENTENCE[@NAME='PRIMARY']/TOKEN/@SENTENCE_END) ]
我收到两个节点作为输出:
<TOKEN BEGIN="17" END="19" SENTENCE_BEGIN="0" SENTENCE_END="156" PROP="C" DOUBLE="YES" />
和
<TOKEN BEGIN="139" END="141" SENTENCE_BEGIN="0" SENTENCE_END="156" PROP="A" DOUBLE="YES" />
上面的结果不正确,因为我想检查一下:
和 的
SENTENCE_BEGIN
SENTENCE_END
值相同,并且TOKEN[@DOULBE=YES]
SENTENCE[@NAME="PRIMARY"]/TOKEN
的属性
BEGIN
值TOKEN[@DOULBE=YES]
小于BEGIN
的SENTENCE[@NAME="PRIMARY"]/TOKEN
结果
<TOKEN BEGIN="139" END="141" SENTENCE_BEGIN="0" SENTENCE_END="156" PROP="A" DOUBLE="YES" />
不正确,因为BEGIN
值(139)大于BEGIN
具有相同值的标记的相应SENTENCE_BEGIN
SENTENCE_END
值:
<TOKEN BEGIN="9" END="11" SENTENCE_BEGIN="0" SENTENCE_END="156" />
<TOKEN BEGIN="32" END="37" SENTENCE_BEGIN="0" SENTENCE_END="156" />
如何修改代码行以获得所需的结果?
解决方案
由于您已标记您的问题 XSLT 1.0,我将使用 XSLT 而不是纯 XPath。这样你就可以使用xsl:key和current()。
例子...
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="primary_tokens"
match="SENTENCE[@NAME='PRIMARY']/TOKEN"
use="concat(@SENTENCE_BEGIN,'|',@SENTENCE_END)"/>
<xsl:template match="/*">
<xsl:for-each select=".//TOKEN[@DOUBLE='YES'][key('primary_tokens',concat(@SENTENCE_BEGIN,'|',@SENTENCE_END))]">
<xsl:if test="key('primary_tokens',concat(@SENTENCE_BEGIN,'|',@SENTENCE_END))[@BEGIN > current()/@BEGIN]">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
推荐阅读
- python - Python Selenium - 错误:元素不可交互。与网站弹出窗口交互
- python-2.7 - Maya 2020 - 移除渲染设置中的灯光集合实例
- javascript - error Unexpected token = 从 RN 0.64.2 升级到 0.65.1 后
- react-native - 在本机基础中将替代调色板设置为默认主题
- nginx - CORS - 缺少允许来源标头 - Centos7 上的 Nginx
- typescript - 如何在打字稿的嵌套属性名称中使用索引类型
- bootstrap-4 - 如何允许非日期信息进入引导日期选择器,特别是星号?
- python - 如何使用 python 库 unittest 断言异常
- r - 如何使用范围表类在 R 中创建直方图?
- firebase - FirebaseAppError:发出请求时出错:套接字挂起。错误代码:ECONNRESET