一千萬個為什麽

搜索

XSLT選擇包含特定子字符串的所有節點

我正在嘗試編寫一個XPath,它將選擇包含特定單詞的某些節點。 在這種情況下,這個詞是“洛克伍德”。正確的答案是3.這兩條路徑都給了我3個。

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

但是當我嘗試輸出每個特定節點的文本時

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

節點1最終包含所有文本,節點2和3為空白。

有人可以告訴我發生了什麽或我做錯了什麽。

謝謝。

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="XPathFunctions.xsl"?>

 <head>
  November 29, 2005
  
   
    Joshua
    Lockwood
   
   Lockwood & Lockwood
   
291 Broadway Ave. New York NY 10007 United States
 
  
 </head>
 <body>
  
   Along with this letter, I have enclosed the following items:
   two original, execution copies of the Webucator Master Services Agreement
   two original, execution copies of the Webucator Premier Support for Developers Services Description between Lockwood & Lockwood and Webucator, Inc.
  
  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.
  Please send all four original, execution copies to my attention as follows:

 
    
     Bill
     Smith
    
    
Webucator, Inc. 4933 Jamesville Rd. Jamesville NY 13078 USA
 
   
  
  If you have any questions, feel free to call me at 800-555-1000 x123 or e-mail me at [email protected]
 </body>
 
  
   
    Bill
    Smith
   
   VP of Operations
  
 

最佳答案

但是當我嘗試輸出文本時   每個特定節點

<�預> <�代碼>//* [含有(./*, '洛克伍德')] [1] //*[contains(./*,'Lockwood')][2] //*[contains(./*,'Lockwood')][3] </代碼>      

節點1最終包含所有文本   節點2和3是空白的

這是一個常見問題解答。

//SomeExpression[1]

不等於

(//someExpression)[1]

前者選擇所有//SomeExpression 節點,這些節點是其父節點的第一個子節點。

後者選擇整個文檔中所有//SomeExpression 節點的第一個(按文檔順序)。

這對您的問題有何影響?

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

這將選擇所有至少有一個子元素的元素,該子元素的字符串值包含“Lockwood”,並且這是其父元素的第一個子元素。具有包含字符串'Lockwood'的文本節點的所有三個元素是其父母的第一個這樣的子元素,因此結果是選擇了三個元素。

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

沒有元素具有包含字符串'Lockwood'的字符串值的子元素,並且是其父元素的第二個子元素。沒有選擇節點。

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

沒有元素具有包含字符串'Lockwood'的字符串值的子元素,並且是其父元素的第三個子元素。沒有選擇節點。

Solution:

使用:

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

這些中的每一個都精確選擇//* [contains(./*,'Lockwood')] 選擇的第N個元素(N = {1,2,3}),相應地: BusinesLetterRecipientBody

Remember:

[] 運算符的優先級(優先級)高於//的縮寫。

轉載註明原文: XSLT選擇包含特定子字符串的所有節點