2013-07-05 225 views
3

我在使用下面的XPath表達式對我的XML文檔進行不區分大小寫的搜索。顯然,我錯了,因爲結果是不同的。希望有人能指出我的錯誤?不區分大小寫的搜索-xpath

我試圖計算<Sect>下的所有Obj元素,其中<Header>值是主要目標。爲了計數,我使用了下面的表達式,這很好用。

表達式 - 無區分大小寫:返回31個節點。

("count(//TaggedPDF-doc//Part//Sect//Sect//Sect[contains(Header,\"Primary objectives\")]//OBJ)"); 

但我想讓「主要目標」不區分大小寫。所以,我試圖使用翻譯。 表達式 - 添加翻譯以使「主要目標」不區分大小寫。

返回0個節點。

$count = $dom->findvalue("count(//TaggedPDF-doc//Part//Sect//Sect//Sect[contains(H4, 
     translate(\"Primary Objectives\", 
        'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 
        'abcdefghjiklmnopqrstuvwxyz') 
     ) 
]//OBJ)"); 

希望有人在這裏可以指出我得到這個錯誤的地方。

由於提前, 西馬克

回答

1

你需要摺疊兩個字符串:

contains(translate(Header, '...', '...'), 'primary objectives') 

注意,您可以使用

# Letters of "primary objectives" 
'ABCEIJMOPRSTVY', 'abceijmoprstvy' 

,而不是較大,但仍有限套裝

# Some of the latin letters 
'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz' 
0

你要做的是檢查H4的內容是否包含「Exclusion criters」轉換爲小寫字母。

計數= $ dom-> findvalue( 「計數(// TaggedPDF-doc的// //部分派// //派宗[含有(H4, 翻譯(\」 排除標準\」, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz') )

] // OBJ)「);

這將是一樣的做:

count = $dom->findvalue("count(//TaggedPDF-doc//Part//Sect//Sect//Sect[contains(
     H4, \"exclusion criteria\" 
    ) 
]//OBJ)"); 

你想要的是翻譯H4的內容爲小寫,並將其與你搜索什麼樣的小寫版本;在這種情況下\"exclusion criteria\"

count = $dom->findvalue("count(//TaggedPDF-doc//Part//Sect//Sect//Sect[contains(
    translate(H4, 
     'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 
     'abcdefghjiklmnopqrstuvwxyz'), 
    \"exclusion criteria\" 
    ) 
]//OBJ)"); 
2

如果你有訪問的XPath 2.0(或更高)的實施 - 這是包括在XQuery中 - ,你可以使用

count(
    //TaggedPDF-doc//Part//Sect//Sect//Sect[ 
    contains(lower-case(H4), 'exclusion criteria') 
    ]//OBJ 
) 

的Perl接口,XPath 2.0中對於eXist DB,BaseX,Saxonlots of others,存在處理器(實際上支持XQuery的XML數據庫)。

+0

一般來說,您需要轉換爲摺疊大小寫(而不是小寫),以便不區分大小寫。但是由於所有的字符都是ASCII字母,這種黑客也可以工作,但比翻譯替代方式更容易輸入。 – ikegami

4

首先,你可能並不需要所有這些//步驟爲//允許任何數量的節點之間的元素命名兩邊的水平 - 無論是使用單/步驟枚舉從根的完整路徑,或只需使用一個//來搜索整棵樹。其次,你需要減少你比較的Header的值,而不是你比較的固定字符串。嘗試更多的東西一樣

count(//Sect[ 
      Header[ 
      contains(
       translate(
       ., 
       'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 
       'abcdefghijklmnopqrstuvwxyz'), 
       'primary objectives' 
      ) 
      ] 
     ]//Obj) 

它會給你一個Sect有任何Header子含有「首要目標」(不區分大小寫)內的任何地方發生Obj元素的個數。這是

count(//Sect[contains(translate(Header, .... 

在該Sect包含不止一個Header的情況略有不同 - 後者只檢查每一個Sect第一Header,而不是尋找其中的任何一場比賽。