Могу ли я вернуть весь документ XML, используя XPath в JavaScript? - PullRequest
1 голос
/ 03 ноября 2010

Я использую 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>

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

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

Ответы [ 3 ]

2 голосов
/ 03 ноября 2010

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

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

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

Большинство браузеров также предлагают какой-либо способ инициирования 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>
0 голосов
/ 03 ноября 2010

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

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

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

0 голосов
/ 03 ноября 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.
...