2011-01-12 32 views
5

Tôi đang cố gắng viết XPath sẽ chọn một số nút nhất định có chứa một từ cụ thể. Trong trường hợp này, từ đó là "Lockwood". Câu trả lời đúng là 3. Cả hai con đường cho tôi 3.XSLT Chọn tất cả các nút có chứa một chuỗi con cụ thể

count(//*[contains(./*,'Lockwood')]) 
count(BusinessLetter/*[contains(../*,'Lockwood')]) 

Nhưng khi tôi cố gắng để sản xuất các văn bản của mỗi nút cụ thể

//*[contains(./*,'Lockwood')][1] 
//*[contains(./*,'Lockwood')][2] 
//*[contains(./*,'Lockwood')][3] 

Node 1 kết thúc chứa tất cả các văn bản và các nút 2 và 3 trống.

Có thể một số người vui lòng cho tôi biết điều gì đang xảy ra hoặc những gì tôi đang làm sai.

Cảm ơn.

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="XPathFunctions.xsl"?> 
<BusinessLetter> 
<Head> 
    <SendDate>November 29, 2005</SendDate> 
    <Recipient> 
    <Name Title="Mr."> 
    <FirstName>Joshua</FirstName> 
    <LastName>Lockwood</LastName> 
    </Name> 
    <Company>Lockwood &amp; Lockwood</Company> 
    <Address> 
    <Street>291 Broadway Ave.</Street> 
    <City>New York</City> 
    <State>NY</State> 
    <Zip>10007</Zip> 
    <Country>United States</Country> 
    </Address> 
    </Recipient> 
</Head> 
<Body> 
    <List> 
    <Heading>Along with this letter, I have enclosed the following items:</Heading> 
    <ListItem>two original, execution copies of the Webucator Master Services Agreement</ListItem> 
    <ListItem>two original, execution copies of the Webucator Premier Support for Developers Services Description between Lockwood &amp; Lockwood and Webucator, Inc.</ListItem> 
    </List> 
    <Para>Please sign and return all four original, execution copies to me at your earliest convenience. Upon receipt of the executed copies, we will immediately return a fully executed, original copy of both agreements to you.</Para> 
    <Para>Please send all four original, execution copies to my attention as follows: 

<Person> 
    <Name> 
    <FirstName>Bill</FirstName> 
    <LastName>Smith</LastName> 
    </Name> 
    <Address> 
    <Company>Webucator, Inc.</Company> 
    <Street>4933 Jamesville Rd.</Street> 
    <City>Jamesville</City> 
    <State>NY</State> 
    <Zip>13078</Zip> 
    <Country>USA</Country> 
    </Address> 
    </Person> 
    </Para> 
    <Para>If you have any questions, feel free to call me at <Phone>800-555-1000 x123</Phone> or e-mail me at <Email>[email protected]</Email>.</Para> 
</Body> 
<Foot> 
    <Closing> 
    <Name> 
    <FirstName>Bill</FirstName> 
    <LastName>Smith</LastName> 
    </Name> 
    <JobTitle>VP of Operations</JobTitle> 
    </Closing> 
</Foot> 
</BusinessLetter> 
+0

Câu hỏi hay, +1. Xem câu trả lời của tôi cho giải thích, giải pháp hoàn chỉnh và dễ dàng và cho một quy tắc hữu ích cần nhớ. :) –

Trả lời

10

Nhưng khi tôi cố gắng để sản xuất các văn bản của mỗi nút cụ thể

//*[contains(./*,'Lockwood')][1] 
//*[contains(./*,'Lockwood')][2] 
//*[contains(./*,'Lockwood')][3] 

Node 1 kết thúc chứa tất cả các văn bản và nút 2 và 3 là trống

Đây là câu hỏi thường gặp.

//SomeExpression[1] 

không phải là tương đương với

(//someExpression)[1] 

sẽ chọn cựu tất cả //SomeExpression nút đó là đứa con đầu lòng của cha mẹ họ.

Sau đó, chọn thứ tự đầu tiên (theo thứ tự tài liệu) của tất cả các nút //SomeExpression trong toàn bộ tài liệu.

Điều này áp dụng cho vấn đề của bạn như thế nào?

//*[contains(./*,'Lockwood')][1] 

này sẽ chọn tất cả các yếu tố đó có ít nhất một đứa trẻ mà chuỗi giá trị chứa 'Lockwood' và đó là những đứa trẻ như vậy đầu tiên của cha mẹ họ. Tất cả ba yếu tố có một nút văn bản có chứa chuỗi 'Lockwood' là con đầu tiên của cha mẹ, do đó kết quả là ba yếu tố được chọn.

//*[contains(./*,'Lockwood')][2] 

Không có phần tử nào có giá trị chuỗi chứa chuỗi 'Lockwood' và là con thứ hai của cha mẹ. Không có nút nào được chọn.

//*[contains(./*,'Lockwood')][3] 

Không có phần tử nào có giá trị chuỗi chứa chuỗi 'Lockwood' và là con thứ ba của cha mẹ. Không có nút nào được chọn.

Giải pháp:

Sử dụng:

(//*[contains(./*,'Lockwood')])[1] 
(//*[contains(./*,'Lockwood')])[2] 
(//*[contains(./*,'Lockwood')])[3] 

Mỗi Selects chính xác các yếu tố thứ N (N = {1,2,3}) được lựa chọn bởi //*[contains(./*,'Lockwood')], tương ứng: BusinesLetter, RecipientBody.

Ghi:

Các [] điều hành có ưu tiên cao hơn (ưu tiên) so với // viết tắt.

+1

+1 Câu trả lời hay. Formaly từ http://www.w3.org/TR/xpath/#NT-Predicate: * Một biến vị ngữ lọc một bộ nút liên quan đến một trục để tạo ra một bộ nút mới *. Và '// * [1]' này được mở rộng thành '/ descendant-or-self :: node()/child :: * [1]' –

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