2010-05-23 44 views
55

Ví dụ, đối xml dưới đâykhớp với phân biệt chữ hoa chữ thường trong xpath?

<CATALOG> 
    <CD title="Empire Burlesque"/> 
    <CD title="empire burlesque"/> 
    <CD title="EMPIRE BURLESQUE"/> 
    <CD title="EmPiRe BuRLeSQuE"/> 
    <CD title="Others"/> 
<CATALOG> 

Làm thế nào để phù hợp với 4 hồ sơ đầu tiên với xpath như //CD[@title='empire burlesque']. Có chức năng xpath để làm điều này? Các giải pháp khác như hàm PHP cũng được chấp nhận.

+1

http://stackoverflow.com/questions/586231/how-can-i-convert-a-string-to-upper-or-lower-case-with-xslt séc Bài viết của ben gripka cho xpath 1.0 – user2237201

Trả lời

88

XPath 2 có hàm chuỗi chữ thường (và chữ thường). Đó là không hoàn toàn giống như case-insensitive, nhưng hy vọng nó sẽ được đóng đủ:

//CD[lower-case(@title)='empire burlesque'] 

Nếu bạn đang sử dụng XPath 1, có một hack using translate.

+0

thực hiện xpath 1 của vtd-xml chứa trường hợp chữ hoa và chữ thường –

+0

Thậm chí làm việc trong các truy vấn XPath của SQL Server trên các cột XML. Xuất sắc. –

+0

Có nhưng https://stackoverflow.com/a/2893899/972128 FTW. – kkurian

8

Một giải pháp PHP có thể:

// load XML to SimpleXML 
$x = simplexml_load_string($xmlstr); 

// index it by title once 
$index = array(); 
foreach ($x->CD as &$cd) { 
    $title = strtolower((string)$cd['title']); 
    if (!array_key_exists($title, $index)) $index[$title] = array(); 
    $index[$title][] = &$cd; 
} 

// query the index 
$result = $index[strtolower("EMPIRE BURLESQUE")]; 
+8

Để người bỏ phiếu ẩn danh: Đọc câu hỏi của OP. Đặc biệt là * "Các giải pháp khác như hàm PHP cũng được chấp nhận." * Một phần. – Tomalak

42

matches() là một chức năng XPath 2.0 cho phép đối với trường hợp không nhạy cảm khớp regex.

Một trong số flagsi cho khớp không phân biệt chữ hoa chữ thường.

XPath sau bằng cách sử dụng matches() chức năng với cờ case-insensitive:

//CD[matches(@title,'empire burlesque','i')] 
+9

Đây là dựa trên regex, đây là sự khác biệt quan trọng đối với kết hợp dựa trên văn bản. – usr

2

Bạn nói rằng các giải pháp PHP là chấp nhận được, và PHP không đưa ra một cách để thực hiện điều này mặc dù nó chỉ hỗ trợ XPath v1. 0. Bạn có thể mở rộng hỗ trợ XPath để cho phép các cuộc gọi hàm PHP.

$xpathObj = new DOMXPath($docObj); 
$xpathObj->registerNamespace('php','http://php.net/xpath'); // (required) 
$xpathObj->registerPhpFunctions("strtolower"); // (leave empty to allow *any* PHP function) 
$xpathObj->query('//CD[php:functionString("strtolower",@title) = "empire burlesque"]'); 

Xem tài liệu PHP registerPhpFunctions để biết thêm ví dụ. Về cơ bản nó chứng tỏ rằng "php: function" là để đánh giá boolean và "php: functionString" là để đánh giá chuỗi.

1

này không làm việc trong các công cụ nhà phát triển Chrome để xác định vị trí một yếu tố, tôi đang tìm cách để xác định vị trí 'Gửi' nút trong màn hình

//input[matches(@value,'submit','i')] 

Tuy nhiên, sử dụng 'dịch' để thay thế tất cả mũ để công trình nhỏ như bên dưới

//input[translate(@value,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz') = 'submit'] 

Cập nhật: Tôi chỉ tìm thấy lý do tại sao 'kết quả' không hoạt động. Tôi đang sử dụng Chrome với xpath 1.0 mà không hiểu cú pháp 'khớp'. Nó phải là xpath 2.0

Các vấn đề liên quan