У меня есть xml:
<Customer id="">
<Name />
<Address />
</Customer>
Я хотел бы выбрать ТОЛЬКО корневой узел с его атрибутами без его дочерних узлов:
<Customer id=""/ >
Возможно ли такое с XPath?
У меня есть xml:
<Customer id="">
<Name />
<Address />
</Customer>
Я хотел бы выбрать ТОЛЬКО корневой узел с его атрибутами без его дочерних узлов:
<Customer id=""/ >
Возможно ли такое с XPath?
Нет, это невозможно в XPath.
Вы не можете выбрать узел без его дочерних элементов, потому что без дочерних элементов это был бы другой узел, следовательно, вы бы не выбрали узел из исходного документа.
Чтобы создать желаемый вывод, вам нужно использовать язык, который позволяет создавать новые узлы, поэтому вы не можете сделать это в XPath. Вы можете использовать XQuery для создания новых узлов, это должно работать:
element {fn:node-name(/*)} {/*/@*}
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=""/>
Это выражение XQuery:
element {name(/*)} {/*/@*}
Выход:
<?xml version="1.0" encoding="UTF-8"?><Customer id=""/>