2012-05-03 32 views
8

Về cơ bản tôi cần phải cạo một số văn bản có thẻ lồng nhau.Biểu thức XPath để chọn tất cả văn bản trong một nút nhất định và văn bản của chldren

Something như thế này:

<div id='theNode'> 
This is an <span style="color:red">example</span> <b>bolded</b> text 
</div> 

Và tôi muốn một biểu rằng sẽ sản xuất này:

This is an example bolded text 

Tôi đã đấu tranh với điều này cho giờ hoặc nhiều hơn với kết quả không.

Any help is appreciated

+0

Bạn có thể muốn xem câu trả lời của tôi, mà không giống như câu trả lời hiện được chấp nhận, là chính xác. –

Trả lời

17

Các string-value của một nút phần tử là nối của chuỗi các giá trị của tất cả các hậu duệ nút văn bản của nút phần tử trong trật tự tài liệu.

Bạn muốn gọi hàm XPath string() trên phần tử div.

string(//div[@id='theNode']) 

Bạn cũng có thể sử dụng chức năng normalize-space để giảm khoảng trắng không mong muốn có thể xuất hiện do dòng mới và thụt lề trong tài liệu nguồn. Điều này sẽ loại bỏ khoảng trắng đầu và cuối và thay thế chuỗi ký tự khoảng trắng bằng một khoảng trắng. Khi bạn chuyển một nodeset tới normalize-space(), nodeset đầu tiên sẽ được chuyển đổi thành giá trị chuỗi của nó. Nếu không có đối số nào được chuyển tới bình thường hóa không gian, nó sẽ sử dụng nút ngữ cảnh.

normalize-space(//div[@id='theNode']) 

// if theNode was the context node, you could use this instead 
normalize-space() 

Bạn có thể muốn sử dụng cách hiệu quả hơn để chọn nút ngữ cảnh hơn so với ví dụ XPath tôi đang sử dụng. ví dụ, ví dụ Javascript sau có thể chạy trên trang này trong một số trình duyệt.

var el = document.getElementById('question'); 
var result = document.evaluate('normalize-space()', el, null).stringValue; 

Khoảng trắng chỉ văn bản nút giữa các yếu tố spanb có thể là một vấn đề.

+0

cảm ơn, hoạt động hoàn hảo! –

+0

@MartinTaleski: Biểu thức XPath trong câu trả lời này đánh giá về chuỗi '" true "'. Đây thực sự là những gì bạn muốn nhận được? –

+0

Có lẽ câu trả lời đã được chỉnh sửa sau nhận xét của Dimitre, vì vậy nhận xét không còn áp dụng được nữa. –

0

Sử dụng:

string(//div[@id='theNode']) 

Khi biểu thức này được đánh giá, kết quả là chuỗi giá trị của người đầu tiên (và hy vọng chỉ) div phần tử trong tài liệu.

Khi giá trị chuỗi của phần tử được xác định trong XPath Specification làm kết nối theo thứ tự tài liệu của tất cả các hậu duệ nút văn bản của nó, đây chính là chuỗi mong muốn.

Bởi vì điều này có thể bao gồm một số toàn màu trắng-không gian nút văn bản, bạn có thể muốn loại bỏ hàng đầu tiếp giáp và đuôi trắng-không gian và thay thế bất kỳ trung gian trắng-không gian như vậy bởi một nhân vật không gian duy nhất:

sử dụng:

normalize-space(string(//div[@id='theNode'])) 

XSLT - dựa xác minh:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
    "<xsl:copy-of select="string(//div[@id='theNode'])"/>" 
=========== 
    "<xsl:copy-of select="normalize-space(string(//div[@id='theNode']))"/>" 
</xsl:template> 
</xsl:stylesheet> 

khi chuyển đổi này được áp dụng trên các tài liệu XML cung cấp:

<div id='theNode'> This is an 
    <span style="color:red">example</span> 
    <b>bolded</b> text 
</div> 

hai biểu thức XPath được đánh giá và kết quả của những đánh giá được sao chép vào đầu ra:

" This is an 
    example 
    bolded text 
" 
=========== 
    "This is an example bolded text" 
0

thế nào về điều này:

/div/text() [1] |/div/span/text() |/div/b/text() |/div/text() [2]

Hmmss Tôi không chắc chắn về phần cuối cùng. Bạn có thể phải chơi với điều đó.

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