Xml 包含动态变量的contains()中的XPath translate()

Xml 包含动态变量的contains()中的XPath translate(),xml,xpath,Xml,Xpath,我正在VBscript中使用一个应用程序,该应用程序使用XPath返回匹配的节点信息 为了使它不区分大小写,我使用了translate函数。有一个变量保存要搜索的值(例如v_search)。在我实现了translate()之后,它不会返回匹配的节点,而是返回XML中的所有节点 下面XPath返回正确的信息,但区分大小写- //*[contains(., '"& v_search &"')]/ancestor-or-self::*/*[local-name()=

我正在VBscript中使用一个应用程序,该应用程序使用XPath返回匹配的节点信息

为了使它不区分大小写,我使用了translate函数。有一个变量保存要搜索的值(例如v_search)。在我实现了
translate()
之后,它不会返回匹配的节点,而是返回XML中的所有节点

下面XPath返回正确的信息,但区分大小写-

//*[contains(., '"& v_search &"')]/ancestor-or-self::*/*[local-name()='name' and @locale='en']
为了使它不区分大小写,我实现了
translate()
,但它无法检查匹配结果。下面是一个表达:-

//*[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') , v_search)]/ancestor-or-self::*/*[local-name()='name' and @locale='en']
我想不出是怎么回事

  • 此表达式返回xml文档中的所有内容

  • 我已经尝试了
    “&v_search&”
    ,在这种情况下,它不会给出任何结果

  • 找出问题后编辑

    //*[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), translate('"& v_search &"', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'))]/ancestor-or-self::*/*[local-name()='name' and @locale='en']
    
    它仍然不会只返回匹配的节点。但是,它现在不会返回整个xml节点

    编辑:-示例Xml

    <root xmlns="https://jlkjsdlfjl/">
        <name>Accounts</name>
        <property name="included" type="hidden">true</property>
        <locales>
            <locale>en</locale>
            <locale>de</locale>
        </locales>
        <defaultLocale>en</defaultLocale>
        <searchspace>
            <name locale="en">Accounts</name>
            <name locale="de">Accounts</name>
            <lastChanged>2014-03-05T18:47:30</lastChanged>
            <lastChangedBy>userx</lastChangedBy>
            <property name="included" type="hidden">true</property>
            <searchspace>
                <name locale="en">Database L</name>
                <name locale="zw">Database L</name>
                <searchSubject status="valid">
                    <name locale="en">SName1</name>
                    <name locale="zw">qskxyz</name>
                    <searchItem>
                        <name locale="en">IName1</name>
                        <name locale="zw">qixyz</name>
                        <hello>v_search</hello>
                    </searchItem>
                     <searchItem>
                        <name locale="en">IName2</name>
                        <name locale="zw">abc</name>
                        v_search
                    </searchItem>
                     <searchItem>
                        <name locale="en">IName3</name>
                        <name locale="zw">def</name>
                        <hello>something else</hello>
                    </searchItem>
                </searchSubject>
            </searchspace>
        </searchspace>
        <searchspace>
            <name locale="en">Names</name>
            <lastChanged>2016-01-12T12:42:46</lastChanged>
            <searchspace>
                <name locale="en">Database Layer</name>
                <name locale="zw">Database Layer</name>
                <searchSubject status="valid">
                    <name locale="en">SName2</name>
                    <searchItem>
                        <name locale="en">IName4</name>
                        <hello>...Hi there..</hello>
                    </searchItem>
                </searchSubject>
            </searchspace>
        </searchspace>
    </root>
    
    
    账户
    真的
    EN
    判定元件
    EN
    账户
    账户
    2014-03-05T18:47:30
    用户X
    真的
    数据库L
    数据库L
    陷阱1
    qskxyz
    稻谷1
    奇克斯
    v_搜索
    稻谷2
    abc
    v_搜索
    稻谷3
    def
    别的
    名字
    2016-01-12T12:42:46
    数据库层
    数据库层
    陷阱2
    稻谷4
    ……你好。。
    
    样本结果:

    帐户,数据库L,SName1,IName 1

    --------在南部2

    这两个Hirachy包含v_搜索文本。。。。其他人不应该来。

    包含(..,v_search)
    确实是错误的。表达式将第一个参数与子元素的值进行比较
    v_search
    。如果在当前上下文元素中未找到
    v_search
    元素,或者找到了该元素但包含空字符串,则始终返回true

    由于将
    contains()
    的第一个参数改为小写,因此需要确保
    v_search
    变量也包含小写字符串

    //*[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), translate('v_search', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'))]/ancestor-or-self::*/name[@locale='en']
    
    我已经在xpathtester中对其进行了测试,结果是:

    <name locale="en">Accounts</name>
    <name locale="en">Database L</name>
    <name locale="en">SName1</name>
    <name locale="en">IName1</name>
    <name locale="en">IName2</name>
    
    账户
    数据库L
    陷阱1
    稻谷1
    稻谷2
    
    在你添加了翻译后,我不明白你为什么在“祖先或自我”之前加“/”。这会让你们所有的孩子都遵守一个条件,每个孩子的祖先都遵守一个条件。这是一个错误。。。。。。还是有问题。。我正在编辑这个问题。在xml中没有主节点,但xpath正在过滤器中查找它们。(local-name()='home')抱歉,我刚刚用'name'替换了“home”节点。在本线程的过程中,您已经做了很多小的更正,因此最好重新开始一个新问题。使问题重现,这样任何人都可以使用你的代码和数据,看看它们是否得到相同的结果。我在更改后进行了编辑,结果仍然不正确,但是它现在不会返回整个xml节点,请建议……如果无法查看您的xml并将其与XPath进行比较,现在还不清楚问题出在哪里。如果您可以发布一个示例关键字来替换变量
    v_search
    ,以及一个非常简化的xml,足以演示应该执行的操作被选中和被选中的insead将更容易提供帮助。顺便说一句,您可以在XPath测试仪中独立于VBA测试XML的XPath,例如(或任何其他XPath测试仪)。谢谢@derloopkat,这与我的问题中的内容相同,但我在测试中没有看到。