使用以下内容;
<a>
<b>false</b>
<b>true</b>
<b>false</b>
<b>false</b>
<b>true</b>
</a>
我希望使用类似的东西得到以下结果 / A / B [。= '真']。位置() 对于像这样的结果 2,5(如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>
</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)
python语言的基本(和工作)方法:
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)