преобразование - Как удалить элементы из xml с помощью xslt со списком стилей и xsltproc?




создание шаблонов (2)

У меня много XML-файлов, которые имеют что-то вроде формы:

<Element fruit="apple" animal="cat" />

Который я хочу удалить из файла.

С помощью таблицы стилей XSLT и утилиты командной строки Linux xsltproc, как я могу это сделать?

К этому моменту в сценарии у меня уже есть список файлов, содержащих элемент, который я хочу удалить, поэтому один файл можно использовать в качестве параметра.

РЕДАКТИРОВАТЬ: вопрос изначально отсутствовал в намерении.

То, что я пытаюсь достичь, - удалить весь элемент «Элемент», где (fruit == «apple» && animal == «cat»). В том же документе есть много элементов под названием «Элемент», я хочу, чтобы они остались. Так

<Element fruit="orange" animal="dog" />
<Element fruit="apple"  animal="cat" />
<Element fruit="pear"   animal="wild three eyed mongoose of kentucky" />

Станет:

<Element fruit="orange" animal="dog" />
<Element fruit="pear"   animal="wild three eyed mongoose of kentucky" />

Answers

Используя один из самых фундаментальных шаблонов проектирования XSLT: «Переопределение преобразования идентичности », вы просто напишете следующее:

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

 <xsl:output omit-xml-declaration="yes"/>

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

    <xsl:template match="Element[@fruit='apple' and @animal='cat']"/>
</xsl:stylesheet>

Обратите внимание, как второй шаблон переопределяет шаблон идентичности (1-й) только для элементов с именем «Элемент», которые имеют атрибут «фрукты» со значением «яблоко» и атрибут «животное» со значением «кошка». Этот шаблон имеет пустое тело, что означает, что согласованный элемент просто игнорируется (ничего не создается, когда оно сопоставляется).

Когда это преобразование применяется к следующему исходному XML-документу:

<doc>... 
    <Element name="same">foo</Element>...
    <Element fruit="apple" animal="cat" />
    <Element fruit="pear" animal="cat" />
    <Element name="same">baz</Element>...
    <Element name="same">foobar</Element>...
</doc>

получается желаемый результат:

<doc>... 
    <Element name="same">foo</Element>...
    <Element fruit="pear" animal="cat"/>
    <Element name="same">baz</Element>...
    <Element name="same">foobar</Element>...
</doc>

Дополнительные фрагменты кода использования и переопределения шаблона идентификации можно найти here .


Форматирование поддержки xmllint на месте :

for f in *.xml; do xmllint -o $f --format $f; done

Как писал Даниэль Вейяр:

Я думаю, xmllint -o tst.xml --format tst.xml должен быть безопасным, так как синтаксический анализатор будет полностью загружать входные данные в дерево перед открытием вывода для его сериализации.

Уровень XMLLINT_INDENT контролируется XMLLINT_INDENT среды XMLLINT_INDENT которая по умолчанию занимает 2 пробела. Пример того, как изменить отступ на 4 пробела:

XMLLINT_INDENT='    '  xmllint -o out.xml --format in.xml

Возможно, вам недостает опции --recover когда вы нарушаете XML-документы. Или попробуйте слабый парсер HTML со строгим XML-выходом:

xmllint --html --xmlout <in.xml >out.xml

--nsclean , --nonet , --nocdata , --noblanks т. д. могут быть полезны. Прочтите страницу руководства.

apt-get install libxml2-utils
apt-cyg install libxml2
brew install libxml2






xml xslt