2012-10-31 200 views
1

具有值的節點的索引列表;如何使用xpath獲取使用xpath

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

欲使用類似 /a/b來得到以下結果[。= '真']。對於像 2,5(作爲對2集合中的結果位置() 位置)

+0

最終做了一個xslt,在所有事情上打了一個ID,所以這個問題變得微不足道了。 –

回答

1

I.的XPath 1.0溶液

使用

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

這產生第一b元件的其字符串值是 「真」 的位置:

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 

二,的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 
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)