我承认我的问题很冗长,可能含糊不清。所以我把它放在这个例子中:
<freshvideos>
<video>
<id>
<![CDATA[ 4f1a6a21egfw4227eaff33de8f571f95 ]]>
</id>
<title>
<![CDATA[ New England Snowstorm - \"Low Gear\" ]]>
</title>
<ensub>
<![CDATA[ I put it in low gear and take it slow. ]]>
</ensub>
<cnsub>
<![CDATA[ 我挂了抵挡,慢慢开。 ]]>
</cnsub>
<filesrc>
<![CDATA[ videos/New England Snowstorm Low Gear.mp4 ]]>
</filesrc>
</video>
<video>
<id>
<![CDATA[ 5fgssd21e779d227eaff33de8f5gesfg ]]>
</id>
<title>
<![CDATA[ New England Rain- \"High Gear\" ]]>
</title>
<ensub>
<![CDATA[ I put it in high gear and take it quick. ]]>
</ensub>
<cnsub>
<![CDATA[ 我挂了高挡,快快开。 ]]>
</cnsub>
<filesrc>
<![CDATA[ videos/New England Rain High Gear.mp4 ]]>
</filesrc>
</video>
</freshvideos>
我想通过在“title”,“ensub”和“cnsub”中搜索关键字来查明一个“视频”的ID,但不能在“filesrc”中找到。
说,如果我搜索“gear slow慢”,它分别出现在第一个视频的“ensub”和“cnsub”中,它会返回第一个“视频”。
目前,我正在使用
xpath "//video[contains(.,'gear') and contains(.,'慢慢')]".
问题是我不想搜索像“filesrc”这样的其他元素,因为我担心我的php托管服务器的性能。
所以我也试过xpath:
"video[title[contains(.,'gear') and contains(.,'慢慢')]|
ensub[contains(.,'gear') and contains(.,'慢慢')]|
cnsub[contains(.,'gear') and contains(.,'慢慢')]]"
新问题是,如果我在两个contains()之间使用“和”,则不匹配任何视频元素。如果我在它们之间使用“或”,则所有视频元素都匹配。
我也试过
"video[contains(tile|ensub|cnsub,'gear') and contains(tile|ensub|cnsub,'慢慢')]"
它没有选择任何东西。我在xpath中想念一下吗?
那么是否有一个xpath表达式意味着“匹配'''''元素,'title','ensub'和'cnsub'一起包含'gear'和'慢慢'?”
提前致谢!! 希望我能理解。
答案 0 :(得分:0)
如果您只需要匹配集合(tile|ensub|cnsub)
中的一个元素:
"//video[ (tile|ensub|cnsub)[contains(.,'gear')] and
(tile|ensub|cnsub)[contains(.,'慢慢')] ]"
如果您只需要确保video
元素的子元素包含两个搜索词:
"//video[ *[contains(.,'gear')] and *[contains(.,'慢慢')] ]"
在你测试它之前,我认为你不应该排除第二种方法。我怀疑它会对您的查询性能产生重大影响。
<强>更新强>
从第一个代码示例中删除了XPath 2.0函数string-join()
。
答案 1 :(得分:0)
"video[contains(concat(title/text(),ensub/text()),'gear') and contains(concat(title/text(),ensub/text()),'慢慢')]"