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

StackOverflow https://stackoverflow.com/questions/3707936

Вопрос

У меня есть 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=""/>
$doc = new DOMDocument();
$doc->loadHTML($str);

$xPath = new DOMXpath($doc);
$xPathQuery = "//text()[contains(translate(.,'abcdefghijklmnopqrstuvwxyz',  'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), '<Customer id=\"\">')]";
$elements = $xPath->query($xPathQuery);

if($elements->length > 0){

foreach($elements as $element){
    print "Found: " .$element->nodeValue."<br />";
}

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

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

Выход:

<?xml version="1.0" encoding="UTF-8"?><Customer id=""/>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top