XPATH: выберите подмножество XML-файла - PullRequest
4 голосов
/ 29 мая 2010

В моем случае у меня есть:

<booklist>
  <book id="1">
  </book>

  <book id="2">
  </book>

  <book id="3">
  </book>

  ......

</booklist>

Как я могу просто вернуться:

<booklist>
  <book id="1">
  </book>
</booklist>

если я использую /booklist/book[@id=1], я могу получить только

<book id="1">
</book>

Но мне также нужен элемент документа. Спасибо

Ответы [ 3 ]

6 голосов
/ 29 мая 2010

Вместо того, чтобы выбрать элемент, который вы хотите , попробуйте , исключая элементы, которые вам не нужны .

Если вы просто используете XPATH , при этом будут выбраны все элементы, кроме элементов book, у которых @id не равно 1 (т.е. <booklist><book id="1" /></booklist>).

//*[not(self::book[@id!='1'])]

Если вы хотите решение XSLT , эта таблица стилей имеет пустой шаблон, который соответствует всем элементам <book>, которые не имеют @id="1", что предотвращает их копирование в вывод.

Все остальное (узел документа <booklist> и <book id="1">) будет соответствовать шаблону идентификации, который копируется вперед.

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

    <!--Empty template to prevent book elements
        that do not have @id="1" from being
        copied into the output -->
    <xsl:template match="book[@id!='1']" />

    <!--identity template to copy all nodes and attributes to output -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>
3 голосов
/ 30 мая 2010

Как я могу просто вернуться:

< booklist >
< book id=1 >
< /book >
< /booklist >

XPath - это язык запросов. Оценка выражения XPath не может изменить структуру документа XML.

Вот почему ответ: Нет, с XPath это невозможно !

Всякий раз, когда вы хотите преобразовать документ XML (что именно здесь и происходит), вероятно, лучшим решением будет использование XSLT - языка, который был разработан специально для обработки и преобразования данных, имеющих древовидную структуру .

Вот очень простое решение XSLT :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

 <xsl:template match="book[not(@id=1)]"/>
</xsl:stylesheet>

Когда это преобразование применяется к предоставленному XML-файлу, получается требуемый, правильный результат :

<booklist>
   <book id="1"/>
</booklist>
2 голосов
/ 29 мая 2010

Когда вы попытаетесь выбрать подэлемент, будет возвращено только это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...