đối sánh không phân biệt chữ hoa chữ thường trong xpath?


78

Ví dụ: đối với xml bên dưới

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

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


1
stackoverflow.com/questions/586231/… hãy xem bài đăng của ben gripka cho xpath 1.0
user2237201

Ở đây, tôi cũng đã tìm thấy thêm 2 giải pháp với mô tả: (không trang web của tôi / khuyến mãi) codingexplained.com/coding/php/...
bharat

Câu trả lời:


115

XPath 2 có một hàm chuỗi viết thường (và viết hoa). Điều đó không hoàn toàn giống với phân biệt chữ hoa chữ thường, nhưng hy vọng nó sẽ đủ gần:

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

Nếu bạn đang sử dụng XPath 1, có một bản hack bằng cách sử dụng dịch .


Thậm chí hoạt động trong các truy vấn XPath của SQL Server trên các cột XML. Thông minh.
TJ Crowder

55

match () là một hàm XPATH 2.0 cho phép đối sánh regex không phân biệt chữ hoa chữ thường.

Một trong những lá cờicho phù hợp với case-insensitive.

XPATH sau sử dụng hàm match () với cờ phân biệt chữ hoa chữ thường:

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

14
Đây là dựa trên regex, đây là một điểm khác biệt quan trọng đối với đối sánh dựa trên văn bản.
usr

12

Điều này không hoạt động trong các công cụ dành cho nhà phát triển Chrome để xác định vị trí một phần tử, tôi đang tìm cách xác định nút 'Gửi' trên màn hình

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

Tuy nhiên, sử dụng 'dịch' để thay thế tất cả các chữ hoa thành các tác phẩm nhỏ như bên dưới

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

Cập nhật: Tôi vừa tìm thấy lý do tại sao 'trận đấu' 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


Nó dường như khái niệm dịch được gọi là 'trường hợp không nhạy cảm đối chiếu' liên quan đến quốc tế hóa
neaumusic

9

Một giải pháp PHP khả thi:

// 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")];

12
Đối với cử tri giấu tên: Đọc câu hỏi của OP. Đặc biệt là "Các giải pháp khác như chức năng PHP cũng được chấp nhận." phần.
Tomalak

3

Bạn đã đề cập rằng các giải pháp PHP được chấp nhận và PHP cung cấp 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 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 minh rằng "php: function" là để đánh giá boolean và "php: functionString" là để đánh giá chuỗi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.