我正在尝试编写一个XPath,它将选择包含特定单词的某些节点.在这种情况下,这个词是"洛克伍德".正确的答案是3.这两条路径都给了我3个.
count(//*[contains(./*,'Lockwood')])
count(BusinessLetter/*[contains(../*,'Lockwood')])
Run Code Online (Sandbox Code Playgroud)
但是当我尝试输出每个特定节点的文本时
//*[contains(./*,'Lockwood')][1]
//*[contains(./*,'Lockwood')][2]
//*[contains(./*,'Lockwood')][3]
Run Code Online (Sandbox Code Playgroud)
节点1最终包含所有文本,节点2和3为空白.
有人可以告诉我发生了什么或我做错了什么.
谢谢.
<?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 & 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 & 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>bsmith@webucator.com</Email>.</Para>
</Body>
<Foot>
<Closing>
<Name>
<FirstName>Bill</FirstName>
<LastName>Smith</LastName>
</Name>
<JobTitle>VP of Operations</JobTitle>
</Closing>
</Foot>
</BusinessLetter>
Run Code Online (Sandbox Code Playgroud)
Dim*_*hev 10
但是当我尝试输出每个特定节点的文本时
Run Code Online (Sandbox Code Playgroud)//*[contains(./*,'Lockwood')][1] //*[contains(./*,'Lockwood')][2] //*[contains(./*,'Lockwood')][3]
节点1最终包含所有文本,节点2和3为空白
这是一个FAQ.
//SomeExpression[1]
Run Code Online (Sandbox Code Playgroud)
不等于
(//someExpression)[1]
Run Code Online (Sandbox Code Playgroud)
前者选择所有//SomeExpression
父节点的第一个子节点.
后者选择//SomeExpression
整个文档中所有节点的第一个(按文档顺序).
这如何适用于您的问题?
//*[contains(./*,'Lockwood')][1]
Run Code Online (Sandbox Code Playgroud)
这将选择所有至少有一个子元素的元素,该子元素的字符串值包含"Lockwood",并且这是其父元素的第一个子元素.具有包含字符串'Lockwood'的文本节点的所有三个元素是其父亲的第一个这样的子节点,因此结果是选择了三个元素.
//*[contains(./*,'Lockwood')][2]
Run Code Online (Sandbox Code Playgroud)
没有元素具有包含字符串'Lockwood'的字符串值的子元素,并且是其父元素的第二个子元素.没有选择节点.
//*[contains(./*,'Lockwood')][3]
Run Code Online (Sandbox Code Playgroud)
没有元素具有包含字符串'Lockwood'的字符串值的子元素,并且是其父元素的第三个子元素.没有选择节点.
方案:
使用:
(//*[contains(./*,'Lockwood')])[1]
(//*[contains(./*,'Lockwood')])[2]
(//*[contains(./*,'Lockwood')])[3]
Run Code Online (Sandbox Code Playgroud)
每个完全第N个元素通过选择这些选择(N = {1,2,3})的//*[contains(./*,'Lockwood')]
,相应地:BusinesLetter
,Recipient
和Body
.
记住:
该[]
经营者具有比更高的优先级(优先级)//
的缩写.