我有一个包含这种结构的HTML页面:
<big><b>Staff in:</b></big>
<br>
<a href='...'>Movie 1</a>
<br>
<a href='...'>Movie 2</a>
<br>
<a href='...'>Movie 3</a>
<br>
<br>
<big><b>Cast in:</b></big>
<br>
<a href='...'>Movie 4</a>
如何使用Xpath选择电影1,2和3? 我写了这个查询
'//big/b[text()="Staff in:"]/following::a'
但它会返回电影1,2,3和4.我想我需要找到一种方法来获取<big><b>Staff in:
之后但下一个<big>
之前的项目。
谢谢,
答案 0 :(得分:2)
假设<big><b>Staff in:</b></big>
是我们可以用作&#39;锚点的唯一元素,您可以尝试这种方式:
//big[b='Staff in:']/following-sibling::a[preceding-sibling::big[1][b='Staff in:']]
基本上,xpath会找到跟随&#39;锚点的兄弟姐妹的所有<a>
。上面提到的<big>
元素,并将结果限制为具有最接近的前一个兄弟<big>
的那些等于锚元素。
输出xpath tester给出标记作为输入(进行最小调整以使其格式良好的XML):
Element='<a href="...">Movie 1</a>'
Element='<a href="...">Movie 2</a>'
Element='<a href="...">Movie 3</a>'
答案 1 :(得分:0)
//a[preceding::b[text()="Staff in:"] and following::b[text()="Cast in:"]]
返回元素a
之后的所有b
,文本Staff in:
但在元素b
之前,文本为Cast in:
。
您可能需要添加更多条件,以使其更具体,具体取决于这些b
元素在页面上是否唯一。
答案 2 :(得分:0)
在这里添加并关注stackoverflow链接XPath axis, get all following nodes until这里是我使用xslt编辑器完成的完整解决方案。首先使用/ * /而不是//因为这更快。其次逻辑说,如果满足大节点之前的兄弟节点等于他们所遵循的内部条件,则返回所有作为大兄弟的锚节点。还假设你有不同的大节点。
x-path看起来像
/*/big[b="Cast in:"]/following-sibling::a [1 = count(preceding-sibling::big[1]| ../big[b="Cast in:"])]
xslt解决方案看起来像
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My Movie Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
</tr>
<xsl:variable name="placeholder" select="/*/big" />
<xsl:for-each select="$placeholder">
<xsl:variable name="i" select="position()" />
<b>
<xsl:value-of select="$i" />
<xsl:value-of select="$placeholder[$i]" />
</b>
<xsl:for-each
select="following-sibling::a [1 = count(preceding-
sibling::big[1]| ../big[b=$placeholder[$i]])]">
<tr>
<td>
<xsl:value-of select="." />
</td>
</tr>
</xsl:for-each>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>