2016-04-05 33 views
1

我正在使用具有XPath返回匹配節點信息的應用程序在VBscript中工作。XPath translate()與contains()中的動態變量

爲了使其不區分大小寫,我正在使用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. 我已經試過'"& 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> 

樣品結果:

賬戶,數據庫L,SName1,INAME 1

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

這兩個hir archy包含v_search文本....別人不應該來。

+0

您加入後翻譯,以前我不正確的「祖先或自身」明白你爲什麼做「//」。這將讓你所有的孩子都符合條件和每個人的祖先。 – derloopkat

+0

這是一個錯誤......仍然有問題..我正在編輯這個問題。 –

+0

在你的xml中沒有主節點,但xpath正在過濾器中查找它們。 (local-name()='home') – derloopkat

回答

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

謝謝@derloopkat,它是一樣的就像我的問題一樣,但我在測試時錯過了。 –

1

contains(.... , v_search)確實是錯的。該表達式將第一個參數與子元素v_search的值進行比較。如果在當前上下文元素中找不到v_search元素,或者找到元素但包含空字符串,則它總是返回true。

由於您將的第一個參數設爲小寫,因此您需要確保v_search變量也包含小寫字符串。

+0

我在修改之後編輯過,結果仍然不正確,但是它現在不會返回整個xml節點,請建議...... –

+0

現在還不清楚問題出在哪裏,而無法看到您的XML並且將它與XPath進行比較。 – har07

+0

如果您可以發佈一個樣本關鍵字來替換變量'v_search'和一個非常簡單的XML,足以證明應該選擇什麼以及選擇什麼,那麼它將更容易幫助。 – har07