1

使用以下内容;

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

我想使用 /a/b[.='true'].position() 之类的结果获得以下结果,例如 2,5 (如在 2 个位置的集合中)

4

2 回答 2

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 everyb , whose string value is“真” . The results of these evaluations are copied to the output

2
5

二、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>

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

2 5
于 2012-10-31T02:15:05.820 回答
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)
于 2012-10-31T01:18:51.910 回答