XPath深度解析:功能、原理与应用
立即解锁
发布时间: 2025-08-17 01:32:39 阅读量: 1 订阅数: 5 

### XPath深度解析:功能、原理与应用
#### 1. XPath概述
XPath主要有两个用途:
- **寻址机制**:它能精准指向XML文档的特定部分,小到单个字符,大到整个节点集。在XSLT样式表中,我们就用它来选择节点,如事件元素或新闻ID属性。而且,XPath不仅用于XSL转换,还用于XLink和XPointer。
- **数据操作**:XPath表达式定位到特定信息项后,可借助内置函数进行字符串操作和数学运算等,用于输出修改后的数据或定位特定数据。例如,搜索特定月份内的所有事件,就需使用能处理特定数据的XPath表达式。
#### 2. XPath工作原理
XPath通过为处理器指定一系列渐进式过滤指令来工作。例如,`/universe/galaxy/starSystem`这个XPath表达式,从整个文档开始,先过滤出所有非`universe`元素,再从`universe`元素的子元素中筛选出`galaxy`元素,最后从`galaxy`元素的子元素中选出`starSystem`元素,最终得到一个节点集。
下面是一个简单的流程说明:
```mermaid
graph TD
A[整个文档] --> B[过滤非universe元素]
B --> C[从universe子元素中选galaxy元素]
C --> D[从galaxy子元素中选starSystem元素]
D --> E[得到节点集]
```
#### 3. 测试结果
为演示示例,我们使用一个简单的XSL样式表,如下:
```xml
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
The XPath expression: "/"
evaluates to:
<xsl:copy-of select="/" />
</xsl:template>
</xsl:stylesheet>
```
该样式表从以下示例文档中提取数据:
```xml
<?xml version="1.0"?>
<universe>
<galaxy gid="g3999">
<dustCloud did="D32" size="6345432"/>
<dustCloud did="X84" size="9249357213"/>
<starSystem sid="_22">
<planet pid="P_22_2">
<name>Troy 2</name><flora>yes</flora><fauna>no</fauna>
</planet>
<planet pid="P_22_7">
<name>Troy 7</name><flora>yes</flora><fauna>yes</fauna>
</planet>
<moon orbits="P_22_7"><name>Unnamed</name></moon>
</starSystem>
</galaxy>
<galaxy gid="g7283">
<starSystem sid="_95">
<planet pid="P_95_3">
<name>Violetta 3</name><flora>yes</flora><fauna>yes</fauna>
</planet>
<planet pid="P_95_4">
<name>Violetta 4</name><flora>yes</flora><fauna>yes</fauna>
</planet>
</starSystem>
</galaxy>
<wormhole wid="WFRSA" stable="no" start="g7283"/>
<wormhole wid="WFRSB" stable="yes" start="g3999" destination="g7283"/>
</universe>
```
若使用Xalan - Java 2处理样式表,可输入以下命令:
```
java org.apache.xalan.xslt.Process -IN input.xml -XSL style.xsl -OUT output.txt
```
要查看文本表达式的结果,可修改样式表,如下:
```xml
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
The XPath expression: "/universe/galaxy/starSystem"
evaluates to:
<xsl:copy-of select="/universe/galaxy/starSystem" />
</xsl:template>
</xsl:stylesheet>
```
#### 4. 位置步骤
XPath表达式由一个或多个位置步骤组成,每个位置步骤包含三个部分:轴、节点测试和可选的谓词。
- **轴和节点测试**:以`/universe/galaxy/starSystem`为例,非缩写形式为`/child::universe/child::galaxy/child::starSystem`。第一个位置步骤`child::universe`,处理器先选择上下文元素(文档根)的子元素,再从中查找名为`universe`的元素。这里`child`是默认轴,实际上还有很多其他类型的轴,如`parent`、`sibling`和`descendant`。例如,可使用`/descendant::starSystem`跳过前两个步骤。
- **谓词**:谓词可进一步缩小选择范围。如`/descendant::starSystem[@sid='_95']`,会过滤出`sid`属性为`_95`的`starSystem`元素。严格来说,该位置步骤的非缩写形式是`/descendant::starSystem[attribute::sid='_95']`。
以下是位置步骤各部分的总结表格:
| 部分 | 说明 |
| ---- | ---- |
| 轴 | 确定选择节点的方向,如`child`、`parent`等 |
| 节点测试 | 筛选符合特定名称的节点 |
| 谓词 | 进一步过滤节点,可应用函数 |
#### 5. 上下文
XPath表达式的结果取决于上下文节点,而整体上下文包含更多信息,会影响最终结果,具体如下:
- **上下文节点**:当前正在分析的节点。
- **上下文大小**:当前正在分析的节点集中的节点数量。
- **上下文位置**:上下文节点在当前节点集中的位置。
- **作用域内的命名空间**:上下文节点作用域内存在的命名空间。
- **作用域内的函数**:上下文节点作用域内的内置或应用添加的函数。
#### 6. 返回数据类型
XPath表达式或位置步骤可返回以下四种类型的数据:
- **字符串**:一系列字符,可能包含空格,如`'Troy 7'`、`'yes'`或`'2'`。
- **数字**:可进行数学运算的数值,XPath定义的数字为IEEE 754规定的64位浮点数。
- **布尔值**:`true`或`false`,通常由函数或类似表达式返回。
- **节点集**:一组节点,可包含元素的属性、元素内的文本、命名空间和处理指令等。
不同类型的操作
0
0
复制全文
相关推荐










