2015-10-22 4 views
2

Как отфильтровать элементы определенного типа, которые не имеют атрибута с магическим значением и сохраняют остальную часть документа? Все это с использованием 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> 

Приветствия

+0

, что именно вы хотите, чтобы вернуться? это не ясно из вопроса. –

+0

xpath like * // database/* "может работать. Подробности сообщения для' не является прямым потомком ... ' – SIslam

ответ

4

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

xmlstarlet ed -d '/database//some[@name != "A"]' input.xml 
+0

во время взлома и обучения xslt я получил слепой ... woa человек, это так просто ... глупо мне ... спасибо! – klsdjfhsalkjfhl

0

Напишите таблицы стилей 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.

+0

Хорошо, это дает результат, который мне нужен ... Но было бы неплохо сделать это работайте в командной строке ... – klsdjfhsalkjfhl

+0

, пока это работает великолепно, мое требование состояло в том, чтобы сделать это непосредственно из командной строки (подумайте Makefile). Поэтому, принимая другой ответ как действительный, извините ;-) – klsdjfhsalkjfhl