【问题标题】:Python lxml XPATH -- find an attribute of all parents of particular nodePython lxml XPATH - 查找特定节点的所有父节点的属性
【发布时间】:2012-12-23 00:54:16
【问题描述】:

在一个 SVG 文件中,我使用xpath 来查找一个包含相对 SVG 路径的节点,例如,

<path d="m -0.3,-0.3 l 0.6,0 l 0,0.6 l -0.6,0 l 0,-0.6 z" transform="translate(-1 -0.5)"/>

这个节点的各个父节点一直到根节点都会有一个

transform="translate(X Y)"

确定上述相对路径的实际放置位置的属性。什么是正确/简洁/有效的方法来捕获这个路径/节点的父级一直到根,特别是那些具有“转换”属性的?

【问题讨论】:

    标签: python xpath svg lxml


    【解决方案1】:

    使用

    'ancestor::*[starts-with(@transform,"translate")]'
    

    例如:

    import lxml.etree as ET
    
    content = '''
    <bar transform="translate(1 1)">
    <foo transform="translate(1 1)">
    <path d="m -0.3,-0.3 l 0.6,0 l 0,0.6 l -0.6,0 l 0,-0.6 z" transform="translate(-1 -0.5)"/>
    </foo>
    </bar>
    '''
    doc = ET.fromstring(content)
    for path in doc.xpath('//path'):
        print(path.xpath('ancestor::*[starts-with(@transform,"translate")]'))
    

    产量

    [<Element bar at 0xb749448c>, <Element foo at 0xb7494504>]
    

    【讨论】:

    • 虽然这个答案让我解决了问题,并且是第一个,但@Dimitre 的答案更具解释性,所以我选择它作为解决方案。谢谢!
    【解决方案2】:

    捕捉父母的正确/简洁/有效的方法是什么 路径/节点一直到根,特别是那些具有 'transform' 属性?

    使用

    ancestor::*[@transform]
    

    这会选择所有具有transform 属性的祖先元素。

    可以直接选择祖先的所有transform属性

    ancestor::*/@transform
    

    如果您只对那些transform 属性感兴趣,其字符串值以字符串“translate(” 开头(可能前面有空格),请使用:

    ancestor::*/@transform[starts-with(normalize-space(@transform),'translate(')]
    

    【讨论】:

    • 谢谢,很有帮助!一件事:@transform 在选择祖先 元素 时有效,但是当直接选择以“translate(”开头的变换属性时,它应该是 .ancestor::*/@transform[starts-with(normalize-space(.),'translate(')]
    • @HonoreDoktorr,是的,答案是针对特定问题和大量超出范围的其他可能问题。例如,另一种变体,当需要祖先和上下文项本身的属性时,可以使用ancestor-or-self::
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 2013-11-24
    • 2013-11-30
    • 2020-06-11
    • 2011-01-30
    相关资源
    最近更新 更多