XPath / XQuery: выберите корневой узел с его атрибутами без дочерних элементов - PullRequest
4 голосов
/ 14 сентября 2010

У меня есть xml:

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

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

<Customer id=""/ >

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

Ответы [ 4 ]

2 голосов
/ 14 сентября 2010

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

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

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

element {fn:node-name(/*)} {/*/@*}
2 голосов
/ 14 сентября 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=""/>
0 голосов
/ 15 сентября 2010

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

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

Выход:

<?xml version="1.0" encoding="UTF-8"?><Customer id=""/>
0 голосов
/ 14 сентября 2010
$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 />";
}
...