xmlstarlet:如何省略具有特定属性的元素?

xmlstarlet: How do I omit elements with a specific attribute?

我想检索某些 XML 元素,但前提是它们不包含具有 starlet 的特定属性。

这是文件 myFile.xml 中的一个 XML 示例:

<?xml version="1.0"?>
<document>
        <classInfo>
                <subjects>
                        <subject id="1" type="someType">
                                <subjectname>Foo1</subjectname>
                        </subject>
                        <subject id="2" subtype="someSubtype" type="someType">
                                <subjectname>Foo2</subjectname>
                        </subject>
                </subjects>
        </classInfo>
</document>

现在,应进一步考虑所有没有子类型的元素,而应忽略所有具有子类型(任何子类型)的元素。

到目前为止,只有考虑所有元素的xmlstarlet选择:

xmlstarlet sel -T -t -m "//subject[@type='someType']" -v '@id' -o $'\t' -v 'subjectname[text()]' -nl myFile.xml

这导致

1 Foo1

2 Foo2

但想要的结果是

1 Foo1

以何种方式增强此选择以忽略每个 subject with a subtype?

尝试将谓词 [not(@subtype)] 添加到您的匹配中...

-m "//subject[@type='someType'][not(@subtype)]"