xmlstarlet: отфильтровать элемент с атрибутом

Как отфильтровать элементы определенного типа, которые не имеют атрибута с магическим значением, и сохранить остальную часть документа? Все это с использованием xmlstarlet?

То, что я должен далеко, это:

cat << EOF > database.xml
<?xml version="1.0"?>
<database>

    <some name="A" />
    <some name="B" />
    <some name="C" />
    <text>this is some text to be applied...</text>
    <project>
        <test deeper="structure"/>
    </project>

</database>
EOF

и

xmlstarlet sel -t -m "*" -c "*[not(self::some[@name != 'A'])]" database.xml

урожаи

<some name="A"/><text>this is some text to be applied...</text><project>
        <test deeper="structure"/>
    </project>

Но это скрывает мои драгоценные <database> tag. Помимо отступа, что не является проблемой... И не работает, когда <some> не являются прямыми потомками <database>, например, дочерними элементами <project>.

Я хочу получить базу данных как она есть, но все <some> удалены, кроме той, что называется A:

<database>

    <some name="A" />


    <text>this is some text to be applied...</text>
    <project>
        <test deeper="structure"/>
    </project>

</database>

Привет


person klsdjfhsalkjfhl    schedule 22.10.2015    source источник
comment
что именно вы хотите вернуть? из вопроса непонятно.   -  person Dmytro Pastovenskyi    schedule 22.10.2015
comment
xpath вроде //database/ может работать. опубликовать подробности для <some> is not direct descendant of <database>...   -  person SIslam    schedule 22.10.2015


Ответы (2)


К сожалению, sel xmlstarlet не поддерживает apply-templates, но вы можете использовать для этого команду ed:

xmlstarlet ed -d '/database//some[@name != "A"]' input.xml
person npostavs    schedule 22.10.2015
comment
взламывая и изучая xslt, я ослеп... вау, это так просто... глупо... спасибо! - person klsdjfhsalkjfhl; 23.10.2015
comment
В моем случае '' сделал работу. Команда обновления не работала в таком виде: xmlstarlet edit -P -L --update /_:bpm-platform/_:process-engine/_:properties/_:property[@name='jobExecutorActivate'] --value true /camunda/conf/bpm-platform.xml.test, пока я не изменил ее на: xmlstarlet edit -P -L --update '/_:bpm-platform/_:process-engine/_:properties/_:property[@name="jobExecutorActivate"]' --value true /camunda/conf/bpm-platform.xml.test - person imy; 12.12.2020

Напишите таблицу стилей XSLT, выполняющую

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="some[@name != 'A']"/>

</xsl:stylesheet>

затем вызовите xmlstarlet, чтобы применить эту таблицу стилей к входному XML: xmlstarlet tr sheet.xsl input.xml.

person Martin Honnen    schedule 22.10.2015
comment
Хорошо, отлично: это дает нужный мне результат... Но было бы неплохо, чтобы это работало в командной строке... - person klsdjfhsalkjfhl; 22.10.2015
comment
хотя это прекрасно работает, мне нужно было сделать это прямо из командной строки (например, Makefile). Поэтому, принимая другой ответ как действительный, извините ;-) - person klsdjfhsalkjfhl; 23.10.2015