Fut*_*e32 6 search xpath contains include match
我正在尝试编写一个Xpath语句(1.0),它可以从"搜索"节点读取信息并使用它执行搜索.
我正在取得一些不错的进展,但偶然发现了一个问题,即如果某个属性(用于搜索中的值)为空或不存在,则会失败.
代码编辑简化示例:
这是我的示例XML:
<xml>
<files>
<file name="foo" description="" rating="4"/>
<file name="food" description="" rating="4"/>
<file name="foobar" description="" rating="3"/>
<file name="bar" description="" rating="3"/>
<file name="barter" description="" rating="3"/>
<file name="barterer" description="" rating="2"/>
</files>
<searches>
<search id="1">
<exclude>
<file term="foo"/>
</exclude>
</search>
</searches>
</xml>
Run Code Online (Sandbox Code Playgroud)
和XPATH一起工作:
//files/file[
not(contains(@name, //search[@id='1']/exclude/file/@term))
]
Run Code Online (Sandbox Code Playgroud)
它按预期工作......
但是,如果期望的属性丢失或为空,则无法工作.我认为因为:contains(@attrib,"")因某种原因匹配所有内容,因此如果属性为""或不存在,则not()将始终不匹配.
例如,如果我将XML的排除片段更改为此,则会失败:
<exclude>
<file term=""/>
</exclude>
Run Code Online (Sandbox Code Playgroud)
这也是:
<exclude></exclude>
Run Code Online (Sandbox Code Playgroud)
有没有办法检查空值而不执行选择?或者是否有更好的结构逻辑方法.请记住,我不能在Xpath2.0中使用Conditionals或其他函数.
所以我在另一篇文章中偶然发现了答案。下面是它的工作示例。谢谢大家的建议。
//files/file[
not(
contains(
@name,
concat( //search[@id='1']/exclude/file/@term,
substring('??', 1 + 2*
boolean( substring( //search[@id='1']/exclude/file/@term, 1 ) )
)
)
)
)
]
Run Code Online (Sandbox Code Playgroud)
我放置“??”的部分 可能想用无效的字符或其他东西替换。对于使用的每个附加字符,1+ 需要增加。对我来说,我正在检查文件名,所以问号似乎是个好主意。老实说我可能不会使用这条路线,我只是渴望解决这个问题。
这是我的想法的来源: How to Give back Constant if Node does not Existence in XPATH?