带有动态变量

时间:2016-04-05 11:36:27

标签: xml xpath

我在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']

我无法弄清楚出了什么问题。

  
      
  1. 此表达式返回xml文档中的所有内容。

  2.   
  3. 在这种情况下,我已经尝试了'"& v_search &"'它没有给出任何结果。

  4.   

编辑找出问题后

//*[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>

示例结果:

  

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

     

--------,----------,-------,IName 2

这两个hirarchy包含v_search文本....其他人不应该来。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

//*[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>