如何获取使用xpath具有值的节点的索引列表

时间:2012-10-31 00:51:12

标签: xpath

使用以下内容;

    <a>
  <b>false</b> 
  <b>true</b> 
  <b>false</b> 
  <b>false</b> 
  <b>true</b> 
  </a>

我希望使用类似的东西得到以下结果 / A / B [。= '真']。位置() 对于像这样的结果 2,5(如2个职位的集合)

2 个答案:

答案 0 :(得分:1)

<强>予。 XPath 1.0解决方案:

使用

count(/*/*[.='true'][1]/preceding-sibling::*)+1

这将生成第一个b元素的位置,其字符串值为“true”:

2

重复对类似表达式的评估,[1]替换为[2],......等,最多count(/*/*[.='true'])

基于XSLT的验证

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/">
   <xsl:for-each select="/*/*[.='true']">
    <xsl:variable name="vPos" select="position()"/>

    <xsl:value-of select=
     "count(/*/*[.='true'][$vPos]
               /preceding-sibling::*) +1"/>
    <xsl:text>&#xA;</xsl:text>
   </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

在提供的XML文档上应用此转换时:

<a>
    <b>false</b>
    <b>true</b>
    <b>false</b>
    <b>false</b>
    <b>true</b>
</a>

The XPath expression is constructed and evaluated for every B , whose string value is “真”. The results of these evaluations are copied to the output

2
5

<强> II。 XPath 2.0解决方案:

使用

index-of(/*/*, 'true')

基于XSLT 2.0的验证

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/">
   <xsl:sequence select="index-of(/*/*, 'true')"/>
 </xsl:template>
</xsl:stylesheet>

当在同一XML文档(上面)上应用此XSLT 2.0转换时,将评估XPath 2.0表达式并将此评估的结果复制到输出

2 5

答案 1 :(得分:0)

语言的基本(和工作)方法:

from lxml import etree
root = etree.XML("""
<a>
  <b>false</b> 
  <b>true</b> 
  <b>false</b> 
  <b>false</b> 
  <b>true</b> 
</a>
""")

c = 0
lst = []

for i in root.xpath('/a/b/text()'):
    c+=1
    if i == 'true':
        lst.append(str(c))

print ",".join(lst)