XPath学习:轴(13)——namespace
XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。
XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 同时被构建于 XPath 表达之上。
推荐一个挺不错的网站:http://www.zvon.org/xxl/XPathTutorial/General_chi/examples.html 里面有很不错的例子,下面的例子中红色字体表示使用对 应语法获取的元素(或属性)。
XPath轴(XPath Axes)可定义某个相对于当前节点的节点集:
1、child 选取当前节点的所有子元素
2、parent 选取当前节点的父节点
3、descendant 选取当前节点的所有后代元素(子、孙等)
4、ancestor 选取当前节点的所有先辈(父、祖父等)
5、descendant-or-self 选取当前节点的所有后代元素(子、孙等)以及当前节点本身
6、ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身
7、preceding-sibling 选取当前节点之前的所有同级节点
8、following-sibling 选取当前节点之后的所有同级节点
9、preceding 选取文档中当前节点的开始标签之前的所有节点
10、following 选取文档中当前节点的结束标签之后的所有节点
11、self 选取当前节点
12、attribute 选取当前节点的所有属性
13、namespace 选取当前节点的所有命名空间节点
名称空间轴用来选取名称空间结点。每个元素结点都有一个专门名称空间结点表示每个作用域名称空间。
分析下面的XML源文档(xmmlBook.xml):
<xmml:Book xmlns:xmml="http://www.XMML.com/namespaces">
<xmml:Chapter number="1">Some text.</xmml:Chapter>
<xmml:Chapter number="2">Some more text.</xmml:Chapter>
</xmml:Book>
为了说明xmml:Book元素结点的名称空间结点,需要使用下面的样式表(xmmlBook.xslt):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xmml="http://www.XMML.com/namespaces" >
<xsl:template match="/">
<html>
<head>
<title>This shows namespace nodes.</title>
</head>
<body>
<h3>Namespace nodes of the xmml:Book element.</h3>
<xsl:apply-templates select="/xmml:Book" />
</body>
</html>
</xsl:template>
<xsl:template match="xmml:Book">
<xsl:for-each select="namespace::node()">
<p><xsl:value-of select="position()" />. The namespace prefix
<b><xsl:value-of select="name(.)" /></b> has the namespace URI <b><xsl:value-of
select="." /></b>. </p>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
注意名称空间声明,在xmml:Book元素上使用了xmml名称空间前缀,如下所示:
<xmml:Book xmlns:xmml="http://www.XMML.com/namespaces">
正如图7-4所示,xmml:Book元素结点有两个名称空间。其中一个名称空间结点是http://www.XMML.com/namespaces的URI,这并不令我们感到意外,因为这已经在名称空间声明中很清楚地表示出来。但是,另一个名称空间结点是http://www.w3.org/XML/1998/ namespace的URI,这有一点出乎我们的意料。之所以有这个名称空间结点,是因为所有的XML元素结点都有一个与此URI对应的名称空间。记住,在任何XML元素上都可以使用xml:lang和xml:space属性,因此必须声明xml名称空间。对于本例的情形,所有的XML处理器都自带了名称空间声明。