【问题标题】:XPATH for all child nodes with different names所有具有不同名称的子节点的 XPATH
【发布时间】:2020-07-08 08:40:10
【问题描述】:

我有一个包含各种子元素的父元素,我需要对其进行计数。我遇到的问题是每个子元素的名称不同,所以每次我使用 count(*) 时,编号都会重新开始。我需要编号去 1.1、1.2、1.3...

父标签<application> 为 1,<ident> 为 1.1,<kitapplic> 为 1.2,<tctoproof> 为 1.3

我以为我可以做一个 count(child::application) ,但那没有用。感谢您的帮助。

<application>
    <ident>
        <para>This Technical Order is applicable.</para>
    </ident>
    <kitapplic>
        <kitapptbl>
            <kitapptblrow>
                <model>Model</model>
                <serialno>Serial Number</serialno>
                <kitno>Kit Required</kitno>
            </kitapptblrow>
        </kitapptbl>
    </kitapplic>
    <tctoproof>
        <para>Time Compliance Technical Order (TCTO) verification, in accordance
            with TO 00-5-15, was accomplished 28 August 2019 at Nellis Air Force
        Base with GCS serial number 5147.</para>
    </tctoproof>
</application>

【问题讨论】:

  • 几个问题...您的意思是将其标记为 sgml 而不是 xml?你真正想做的是什么(比计数元素更高的水平)?你的输出应该是什么样的?你用什么来执行 XPath(它是 XSLT 的一部分吗?)?
  • 是的,这是 SGM。我正在使用 Arbortext Styler 创建样式表。您可以指定元素为编号类型,并且可以选择使用 XPATH 表达式。父标签 为 1, 为 1.1, 为 1.2, 为 1.3
  • 我也试过 /Application/child::node() 但也没有用。
  • 也许计数不是我需要的。 position( ) 会给我父元素中的节点编号位置。但我无法让它工作。
  • 可以想出 xpath/xquery 表达式,它会给你每个节点的深度;例如,两个&lt;para&gt;s 将是每个深度3,等等。但我不确定如何将第一个&lt;para&gt; 转换为“1.1.1”,第二个转换为“1.3” .1".

标签: xpath sgml


【解决方案1】:

使用 XPath,您可以使用 count preceding-siblingconcat 来获得所需的数字。 kitapplic 示例:

concat("1.",count(application/kitapplic/preceding-sibling::*)+1)

输出:1.2

如果您需要为应用程序元素的每个子元素创建一个包含 1.1、1.2、1.3 的列表(Python 中的示例):

data = """<application>
    <ident>
        <para>This Technical Order is applicable.</para>
    </ident>
    <kitapplic>
        <kitapptbl>
            <kitapptblrow>
                <model>Model</model>
                <serialno>Serial Number</serialno>
                <kitno>Kit Required</kitno>
            </kitapptblrow>
        </kitapptbl>
    </kitapplic>
    <tctoproof>
        <para>Time Compliance Technical Order (TCTO) verification, in accordance
            with TO 00-5-15, was accomplished 28 August 2019 at Nellis Air Force
        Base with GCS serial number 5147.</para>
    </tctoproof>
</application>"""

import lxml.html
tree = lxml.html.fromstring(data)

for el in tree.xpath("//application/*"):
    print(el.xpath("concat(name(.),' 1.',count(./preceding-sibling::*)+1)"))

输出:

ident 1.1
kitapplic 1.2
tctoproof 1.3

【讨论】:

  • 感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 2014-07-06
  • 1970-01-01
  • 1970-01-01
  • 2019-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多