繁体   English   中英

仅获取xpath的最后一部分

[英]Get only last part of xpath

我在python 2.7中使用lxml来解析xml文件。

该文件如下所示:

...
<LM>sua</LM>
<LM>citt&agrave;</LM>
<LM>e</LM>
<LM>l'</LM>
<LM>alto</LM>
<LM>seggio</LM>:
     </l><l>
<LM>oh</LM>
<LM>felice</LM>
<LM>colui</LM>
<LM>cu'</LM>
<LM>ivi</LM>
<LM>elegge</LM>!.
     </l><l>
<LM> E</LM>
<LM>io</LM>
<LM>a</LM>
<LM>lui</LM>:
...

我正在树上寻找LM节点。

for node in [z for z in  tree.iterfind(".//LM")]:
    print tree.getpath(node.getparent())

并且每个节点得到以下输出:

'/TEI.2/text/body/div1/l[480]'

因此,在这种情况下,这意味着当前节点LM在第480个节点L之下。是否有一种方法可以获取此480,请注意以下内容?

In [77]: int(tree.getpath(node.getparent()).split('/')[5][2:].replace(']',''))
Out[77]: 480

我的意思是通过xpath的一种优雅方式。

因此,在这种情况下,这意味着当前节点LM在第480个节点L之下。是否有一种方法可以获取此480,请注意以下内容?

 int(tree.getpath(node.getparent()).split('/')[5][2:].replace(']','')) 

如果我理解正确,那么您只想要相对于其父代的职位? 您可以通过执行以下操作使XPath返回最后一个位置:

node.find("position()")

在普通的XPath 1.0中,这意味着“获取当前节点相对于其父节点的位置”。 但是, 此Python模块XPath支持似乎受到严重限制 支持的表达式只能用于返回节点,而不能返回值。

如果可以在Python中使用XSLT ,则可以使用XPath 1.0语法//LM/position()获得所有位置。 为了获得成功,您还需要做更多的事情:

<xsl:template match="/">
    <xsl:apply-templates select="//LM" />
</xsl:template>

<xsl:template match="LM">
    <xsl:text>Position: </xsl:text>
    <xsl:value-of select="position()" />
    <xsl:text>, XPath: </xsl:text>
    <xsl:apply-templates select="ancestor::*" mode="path" />
    <xsl:text>&#xA;</xsl:text>
</xsl:template>

<xsl:template match="*" mode="path">
    <xsl:text>/</xsl:text>
    <xsl:value-of select="name()" />
</xsl:template>

这将输出一堆行,例如:

Position: 4, XPath: /a/b/c
Position: 9, XPath: /a/b/d

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM