XPath/XQuery: выберите корневой узел с его атрибутами без дочерних элементов.

У меня есть xml:

<Customer id="">
 <Name />
 <Address />
</Customer>

Я хотел бы выбрать ТОЛЬКО корневой узел с его атрибутами без его дочерних узлов:

<Customer id=""/ >

Возможно ли такое с XPath?


person Timofey    schedule 14.09.2010    source источник
comment
Хороший вопрос (+1). См. мой ответ для краткого решения XSLT.   -  person Dimitre Novatchev    schedule 14.09.2010


Ответы (4)


Нет, это невозможно в XPath.

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

Чтобы создать желаемый вывод, вам нужно использовать язык, который позволяет создавать новые узлы, поэтому вы не можете сделать это в XPath. Вы можете использовать XQuery для создания новых узлов, это должно работать:

element {fn:node-name(/*)} {/*/@*}
person Nick Jones    schedule 14.09.2010

XPath не изменяет исходный XML-документ, и это сделано намеренно.

Чтобы создать новый XML-документ из существующего, требуется преобразование.

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

Это преобразование:

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

    <xsl:template match="/*">
      <xsl:copy>
       <xsl:copy-of select="@*"/>
      </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

при применении к предоставленному XML-документу:

<Customer id="">
    <Name />
    <Address />
</Customer>

выдает желаемый правильный результат:

<Customer id=""/>
person Dimitre Novatchev    schedule 14.09.2010

Это выражение XQuery:

element {name(/*)} {/*/@*}

Выход:

<?xml version="1.0" encoding="UTF-8"?><Customer id=""/>
person Community    schedule 14.09.2010

person    schedule
comment
Спасибо за ответ, но мне нужна конструкция XPath, так как я делаю это в T-SQL. Что-то вроде: выберите @XmlData.query('/[nochildrenhere]') - person Timofey; 14.09.2010
comment
Ааа хорошо, тогда я не могу вам помочь, извините! - person ; 14.09.2010