2012-06-11 16 views
13

tôi đã được đưa ra XML sau:phần tử XML có không gian tên, XPATH tôi không hoạt động

<root> 
    <items> 
    <item> 
     <title>Item</title> 
     <details> 
     <data xmlns="http://some_url"> 
      <length>10</length> 
      <weight>1.2</weight> 
     </data> 
     </details> 
    </item> 
    </items> 
</root> 

Sau XPath không hoạt động có nghĩa là không có gì được in như phần tử "dữ liệu" không tồn tại:

/root/items/item/details/data 

Nhưng khi tôi loại bỏ thuộc tính không gian tên "xmlns" của phần tử "dữ liệu", nội dung của nó được in. Biểu thức xpath trông như thế nào để hoạt động mà không xóa thuộc tính không gian tên "xmlns" của phần tử "data"?

Tôi đang sử dụng SAXON và XSL 1.0.

+0

Bạn cần đăng ký không gian tên với XPath e ngine, sau đó sử dụng bí danh bạn đã đăng ký trong XPath của bạn: 'alias: data/alias: length'. Chúng tôi không thể cụ thể hơn thế mà không biết bạn đang sử dụng cái gì để đánh giá XPath. –

Trả lời

13

Đây là một trong Câu hỏi thường gặp nhất trong XPath/XSLT:

XPath giải thích tên phần tử không cố định thuộc về "không có không gian tên" và đây là lý do các phần tử không được cố định thuộc về không gian tên mặc định (nonempty) không được chọn khi chỉ tên không được định sẵn được xác định như là một nút thử nghiệm trong một biểu thức XPath.

Giải pháp là một trong hai:

  1. Tạo một không gian tên ràng buộc nơi một tiền tố (nói "x") được kết hợp với không gian tên mặc định, sau đó xác định x:elementName thay vì elementName.

  2. Sử dụng cụm từ dài, xấu xí và không đáng tin cậy như: *[name() = 'elementName']

Dưới đây là một chuyển đổi XSLT sử dụng method1 trên. :

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:a="http://some_url"> 
<xsl:output method="text"/> 

<xsl:template match="/"> 
    <xsl:value-of select= 
    "/root/items/item/details/a:data/a:weight"/> 
</xsl:template> 
</xsl:stylesheet> 

Khi chuyển đổi này được áp dụng (sử dụng Saxon 6.5.4 hoặc bất kỳ XSLT compliant 1.0 bộ xử lý khác) trên các tài liệu XML cung cấp:

<root> 
    <items> 
     <item> 
      <title>Item</title> 
      <details> 
       <data xmlns="http://some_url"> 
        <length>10</length> 
        <weight>1.2</weight> 
       </data> 
      </details> 
     </item> 
    </items> 
</root> 

Các đúng/muốn nút được chọn và giá trị chuỗi của nó được sao chép vào đầu ra:

1.2 
0

Trong XPath, bạn phải chỉ định tiền tố cho không gian tên. Làm thế nào bạn làm điều đó phụ thuộc vào XPath phần mềm/thư viện bạn đang sử dụng, nhưng giả sử bạn kết hợp namespace URI http://some_url với namespace prefix someUrl, bạn có thể thay đổi biểu thức XPath của bạn như sau:

/root/items/item/details/someUrl:data 
+0

Cảm ơn bạn đã trả lời. Tôi đang sử dụng SAXON và XSL 1.0. Tôi đã thử truy vấn xpath "/ root/items/item/details/a: data" và nó in tất cả nội dung của phần tử "data". Khi tôi truy vấn "/ root/items/item/details/a: dữ liệu/a: trọng lượng" tôi mong đợi "1.2" sẽ được in nhưng lại in tất cả nội dung của phần tử "dữ liệu". Bạn có thể vui lòng cho biết tôi đang làm gì sai? – Vojtech

+0

Khi bạn đang sử dụng XSL, bạn có thể vui lòng hiển thị biểu định kiểu XSL hoàn chỉnh của mình không? (hoặc ít nhất một phiên bản thu nhỏ được hoàn thành hợp lý?) –