मैं कुछ एक्सएमएल तत्वों को पुनर्प्राप्त करना चाहता हूं, लेकिन केवल तभी जब उनमें स्टारलेट के साथ कोई विशिष्ट विशेषता न हो।

फ़ाइल 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
Yahalnaut 12 नवम्बर 2020, 20:06

1 उत्तर

सबसे बढ़िया उत्तर

अपने मिलान में विधेय [not(@subtype)] जोड़ने का प्रयास करें...

-m "//subject[@type='someType'][not(@subtype)]"
1
Daniel Haley 12 नवम्बर 2020, 20:55