首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >只获取xpath的最后一部分

只获取xpath的最后一部分
EN

Stack Overflow用户
提问于 2015-09-08 13:44:18
回答 1查看 255关注 0票数 0

我在python2.7中使用lxml来解析xml文件。

该文件如下所示:

代码语言:javascript
运行
复制
...
<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节点。

代码语言:javascript
运行
复制
for node in [z for z in  tree.iterfind(".//LM")]:
    print tree.getpath(node.getparent())

对于每个节点,我得到以下输出:

代码语言:javascript
运行
复制
'/TEI.2/text/body/div1/l[480]'

因此,在这种情况下,这意味着当前节点LM位于480节点L下。有什么方法可以得到这480,注意到以下内容吗?

代码语言:javascript
运行
复制
In [77]: int(tree.getpath(node.getparent()).split('/')[5][2:].replace(']',''))
Out[77]: 480

我指的是通过xpath的优雅方式。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-08 22:51:34

因此,在这种情况下,这意味着当前节点LM位于480节点L下。有什么方法可以得到这480,注意到以下内容吗? ( int(tree.getpath(node.getparent()).split('/')5.replace(']',‘’)

如果我对你的理解是正确的,你只想要相对于它的父母的职位?通过执行以下操作,可以让XPath返回最后一个位置:

代码语言:javascript
运行
复制
node.find("position()")

在普通的XPath 1.0中,这意味着“获取当前节点相对于其父节点的位置”。然而,它看起来像XPath对这个模块的支持是非常有限的。。所支持的表达式只能用于返回节点,而不能用于返回值。

如果您可以在Python中使用XSLT,您可以使用XPath 1.0语法//LM/position()获得所有位置。为了获得这条路,你必须做得更多:

代码语言:javascript
运行
复制
<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>

这将输出如下所示的一行:

代码语言:javascript
运行
复制
Position: 4, XPath: /a/b/c
Position: 9, XPath: /a/b/d
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32459474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档