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)]"
我想检索某些 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)]"