1

我正在使用 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,据我所知,Javascript 中的 XQuery 没有内置实现。

我想连同我需要的东西一起归还祖先。但是,如果我得到几个结果,它也应该可以工作。使用 XPath 是否可行?

4

3 回答 3

2

XPath 无法更改源 XML 文档,也无法生成新的 XML 文档。

因此,为此必须使用其他一些技术。XSLT 是一种专门为进行此类转换而设计的语言。

在大多数浏览器中,您可以使用由关联<?xml-stylesheet ?>PI(处理指令)标识的 XSLT 样式表来处理 XML 文档。

大多数浏览器还提供了一些在 Javascript 中启动 XSLT 转换的方法——请阅读您的浏览器文档。

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>
于 2010-11-03T13:09:52.233 回答
0

一般来说,不,您不能单独使用 XPath 来做到这一点——它只是一种表达式语言。XPath 不能创建节点,它只能选择它们。您可以(如您所愿)选择一组节点,但您不能将它们包装在其他节点中。

您当然可以改变@kadalmittai 的建议并使用DOM API 来选择您的节点,创建一个新文档并将您选择的节点克隆到其中,但考虑到您相当简单的要求,这是相当重量级的。

XSLT 在这里可能是一种更好的方法,但我对浏览器技术的了解还不够,无法告诉您如何在浏览器中使用它。

于 2010-11-03T10:41:27.067 回答
0

浏览器 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.
于 2010-11-03T07:39:02.060 回答