如果搜索参数为空或缺少/ false,我如何使用Xpath函数'contains()'返回任何内容?

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或其他函数.

Fut*_*e32 0

所以我在另一篇文章中偶然发现了答案。下面是它的工作示例。谢谢大家的建议。

//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?