Могу ли я вернуть весь XML-документ с помощью XPath в javascript?

Я использую Javascript и хочу вернуть XML-документ с желаемыми результатами.

Например, XML-документ может быть <books> <book> <title> Introduction to XML </title> </book> <book> <title> Introduction to Javascript </title> </book> </books>

и используя это выражение XPath: //book[./title="Introduction to XML"] Я хочу получить такой документ <books> <book> <title> Introduction to XML </title> </book> </books>

Я знаю, что XQuery звучит здесь как решение, но я использую Javascript, и, насколько мне известно, встроенных реализаций XQuery в Javascript нет.

Я хочу вернуть предков вместе с нужной мне вещью. Но это также должно сработать, если я получу несколько результатов ... возможно ли это с помощью XPath?


person Mohamed Khamis    schedule 03.11.2010    source источник
comment
Хороший вопрос, +1. См. Мой ответ для объяснения и решения с использованием XSLT.   -  person Dimitre Novatchev    schedule 03.11.2010


Ответы (3)


XPath не может изменить исходный XML-документ и не может создать новый XML-документ.

Следовательно, для этого необходимо использовать какую-то другую технологию. XSLT - это язык, специально разработанный для выражения таких преобразований.

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

Большинство браузеров также предлагают способ инициировать преобразование XSLT в Javascript - прочтите документацию вашего браузера.

Само преобразование 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:param name="pTitleWanted" select="' Introduction to XML '"/>

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

 <xsl:template match="books">
  <xsl:copy>
    <xsl:apply-templates select="book[title = $pTitleWanted]"/>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

когда это преобразование применяется к предоставленному XML-документу:

<books>
    <book>
        <title> Introduction to XML </title>
    </book>
    <book>
        <title> Introduction to Javascript </title>
    </book>
</books>

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

<books>
   <book>
      <title> Introduction to XML </title>
   </book>
</books>
person Dimitre Novatchev    schedule 03.11.2010
comment
Хороший ответ - я предположил, что ему нужен какой-то программный интерфейс, чтобы <?xsl-stylesheet?> не подходил. Мои познания в кодировании javascript ... антиквариат. - person Nic Gibson; 03.11.2010

Среда JavaScript браузера поставляется с анализатором объектной модели документа XML по умолчанию.

Вы можете воспользоваться этим элементом управления и проанализировать его как Dom Parsing Style.

enter code here
var _xml = "<books> <book> <title> Introduction to XML </title> </book> </books>"
parser=new DOMParser();
xmlDoc=parser.parseFromString(_xml,"text/xml");
//Use any type of DOM API to parse
xmlDoc.childNodes()...... 

This code is for FireFox Browser. You can do the same thing in IE using their ActiveXControls as like XmlHttp way.
person kadalamittai    schedule 03.11.2010

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

Вы, безусловно, можете изменить предложение @kadalmittai и использовать DOM API для выбора узлов, создания нового документа и клонирования выбранных узлов в него, но это довольно тяжело, учитывая ваше довольно простое требование.

XSLT может быть здесь лучшим подходом, но я недостаточно знаю о браузерных технологиях, чтобы рассказать вам, как использовать его в браузере.

person Nic Gibson    schedule 03.11.2010