<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>绿色记忆 &#187; XPath</title>
	<atom:link href="https://blog.gmem.cc/tag/xpath/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.gmem.cc</link>
	<description></description>
	<lastBuildDate>Sun, 19 Apr 2026 07:54:29 +0000</lastBuildDate>
	<language>en-US</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.9.14</generator>
	<item>
		<title>XPath知识集锦</title>
		<link>https://blog.gmem.cc/xpath-faq</link>
		<comments>https://blog.gmem.cc/xpath-faq#comments</comments>
		<pubDate>Fri, 26 Oct 2012 02:53:13 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[XML]]></category>
		<category><![CDATA[XPath]]></category>

		<guid isPermaLink="false">http://blog.gmem.cc/?p=6850</guid>
		<description><![CDATA[<p>基础知识 XPath即为XML路径语言（XML Path Language），是一种用来确定XML文档中某部分位置的语言。在类似的语言，例如HTML中，XPath也被某些框架组件使用。 XPath表达式用于匹配XML节点或者节点集。它由[crayon-69e5935d2c536142006141-i/] 分隔的若干片断组成，每个片断都相对于其上下文节点来描述，片断可以包含： 轴描述：描述匹配节点相对于上下文节点的“所在方向”，后面跟着[crayon-69e5935d2c53d661813135-i/] 后缀 节点测试：描述匹配的节点名（元素标签名）或者更一般的表达式 谓词：该部分是可选的，位于轴描述+节点测试之后布尔表达式，用方括号[crayon-69e5935d2c540108869345-i/] 包含。谓词可以基于属性、子节点对轴描述匹配的节点进行过滤 XPath片断的语法格式可以表示为：[crayon-69e5935d2c542276231682-i/] ，其中[crayon-69e5935d2c544517298452-i/] 可由简写代替，参见下一小节。 轴描述 轴描述 简写 说明 child 省略 上下文节点的直接的子节点 attribute @ 上下文节点的属性 descendant   上下文节点的后代节点 <a class="read-more" href="https://blog.gmem.cc/xpath-faq">[...]</a></p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/xpath-faq">XPath知识集锦</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div class="blog_h2"><span class="graybg">基础知识</span></div>
<p>XPath即为XML路径语言（XML Path Language），是一种用来确定XML文档中某部分位置的语言。在类似的语言，例如HTML中，XPath也被某些框架组件使用。</p>
<p>XPath表达式用于匹配XML节点或者节点集。它由<pre class="crayon-plain-tag">/</pre> 分隔的若干片断组成，每个片断都相对于其上下文节点来描述，片断可以包含：</p>
<ol>
<li>轴描述：描述匹配节点相对于上下文节点的“所在方向”，后面跟着<pre class="crayon-plain-tag">::</pre> 后缀</li>
<li>节点测试：描述匹配的节点名（元素标签名）或者更一般的表达式</li>
<li>谓词：该部分是可选的，位于轴描述+节点测试之后布尔表达式，用方括号<pre class="crayon-plain-tag">[]</pre> 包含。谓词可以基于属性、子节点对轴描述匹配的节点进行过滤</li>
</ol>
<p>XPath片断的语法格式可以表示为：<pre class="crayon-plain-tag">轴描述::节点测试[谓词]</pre> ，其中<pre class="crayon-plain-tag">轴描述::</pre> 可由简写代替，参见下一小节。</p>
<div class="blog_h3"><span class="graybg">轴描述</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 20%; text-align: center;">轴描述</td>
<td style="width: 10%; text-align: center;">简写</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>child</td>
<td>省略</td>
<td>上下文节点的直接的子节点</td>
</tr>
<tr>
<td>attribute</td>
<td>@</td>
<td>上下文节点的属性</td>
</tr>
<tr>
<td>descendant</td>
<td> </td>
<td>上下文节点的后代节点</td>
</tr>
<tr>
<td>descendant-or-self</td>
<td>//</td>
<td>上下文节点或者其后代节点</td>
</tr>
<tr>
<td>parent</td>
<td>..</td>
<td>上下文节点的直接父节点</td>
</tr>
<tr>
<td>ancestor</td>
<td> </td>
<td>上下文节点的祖代节点</td>
</tr>
<tr>
<td>ancestor-or-self</td>
<td> </td>
<td>上下文节点或者其祖代节点</td>
</tr>
<tr>
<td>following</td>
<td> </td>
<td>后续兄弟节点及其子节点</td>
</tr>
<tr>
<td>preceding</td>
<td> </td>
<td>前导兄弟节点及其子节点</td>
</tr>
<tr>
<td>following-sibling</td>
<td> </td>
<td>后续兄弟节点</td>
</tr>
<tr>
<td>preceding-sibling</td>
<td> </td>
<td>前导兄弟节点</td>
</tr>
<tr>
<td>self</td>
<td>.</td>
<td>上下文节点</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">节点测试</span></div>
<p>节点测试可以指定通配符<pre class="crayon-plain-tag">*</pre> ，用于匹配所有节点。如果要选择非默认名字空间前缀中的节点，需要使用<pre class="crayon-plain-tag">namespace-prefix:节点测试</pre> 的形式。</p>
<p>除了指定节点名称（元素表签名），还可以使用特殊表达式：</p>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 35%; text-align: center;">节点测试表达式</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td><pre class="crayon-plain-tag">comment()</pre> </td>
<td>选择XML注释节点</td>
</tr>
<tr>
<td><pre class="crayon-plain-tag">text()</pre></td>
<td>选择文本节点</td>
</tr>
<tr>
<td><pre class="crayon-plain-tag">processing-instruction()</pre></td>
<td>选择XML处理指令，例如<pre class="crayon-plain-tag">&lt;?php ?&gt;</pre> </td>
</tr>
<tr>
<td><pre class="crayon-plain-tag">node()</pre> </td>
<td>选择所有节点</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">运算符</span></div>
<p>XPath支持以下运算符：</p>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 35%; text-align: center;">运算符</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td><pre class="crayon-plain-tag">|</pre> </td>
<td>合集运算符，一般用于合并（或）两个轴描述</td>
</tr>
<tr>
<td><pre class="crayon-plain-tag">and</pre>    <pre class="crayon-plain-tag">or</pre>    <pre class="crayon-plain-tag">not()</pre> </td>
<td>逻辑运算符，最后一个是函数</td>
</tr>
<tr>
<td><pre class="crayon-plain-tag">+</pre>  <pre class="crayon-plain-tag">-</pre>  <pre class="crayon-plain-tag">*</pre>  <pre class="crayon-plain-tag">div</pre>  <pre class="crayon-plain-tag">mod</pre> </td>
<td>算术运算符，加减乘除模</td>
</tr>
<tr>
<td><pre class="crayon-plain-tag">=</pre>   <pre class="crayon-plain-tag">!=</pre>   <pre class="crayon-plain-tag">&lt;</pre>    <pre class="crayon-plain-tag">&gt;</pre>   <pre class="crayon-plain-tag">&lt;=</pre>  <pre class="crayon-plain-tag">&gt;=</pre> </td>
<td>比较运算符</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">XPath示例</span></div>
<p>以/开头的XPath表示绝对路径：</p>
<pre class="crayon-plain-tag">&lt;!-- /AAA 选择根元素AAA --&gt;
&lt;AAA&gt; &lt;!--Matches--&gt;
     &lt;BBB/&gt;
     &lt;CCC/&gt;
     &lt;BBB/&gt;
     &lt;BBB/&gt;
     &lt;DDD&gt;
          &lt;BBB/&gt;
     &lt;/DDD&gt;
     &lt;CCC/&gt;
&lt;/AAA&gt;

&lt;!-- /AAA/CCC 选择AAA的所有CCC子元素 --&gt;
&lt;AAA&gt;
     &lt;BBB/&gt;
     &lt;CCC/&gt; &lt;!--Matches--&gt;
     &lt;BBB/&gt;
     &lt;BBB/&gt;
     &lt;DDD&gt;
          &lt;BBB/&gt;
     &lt;/DDD&gt;
     &lt;CCC/&gt; &lt;!--Matches--&gt;
&lt;/AAA&gt;</pre>
<p>如果路径以双斜线<pre class="crayon-plain-tag">//</pre> 开头, 则表示选择文档中所有满足双斜线//之后规则的元素，不考虑层级关系：</p>
<pre class="crayon-plain-tag">&lt;!-- //BBB 选择所有BBB元素 --&gt;
&lt;AAA&gt;
     &lt;BBB/&gt; &lt;!--Matches--&gt;
     &lt;CCC/&gt;
     &lt;BBB/&gt; &lt;!--Matches--&gt;
     &lt;DDD&gt;
          &lt;BBB/&gt; &lt;!--Matches--&gt;
     &lt;/DDD&gt;
     &lt;CCC&gt;
          &lt;DDD&gt;
               &lt;BBB/&gt; &lt;!--Matches--&gt;
               &lt;BBB/&gt; &lt;!--Matches--&gt;
          &lt;/DDD&gt;
     &lt;/CCC&gt;
&lt;/AAA&gt; 

&lt;!-- //DDD/BBB 选择所有父元素是DDD的BBB元素 --&gt;
&lt;AAA&gt;
     &lt;BBB/&gt;
     &lt;CCC/&gt;
     &lt;BBB/&gt;
     &lt;DDD&gt;
          &lt;BBB/&gt; &lt;!--Matches--&gt;
     &lt;/DDD&gt;
     &lt;CCC&gt;
          &lt;DDD&gt;
               &lt;BBB/&gt; &lt;!--Matches--&gt;
               &lt;BBB/&gt; &lt;!--Matches--&gt;
          &lt;/DDD&gt;
     &lt;/CCC&gt;
&lt;/AAA&gt;</pre>
<p>星号<pre class="crayon-plain-tag">*</pre> 为通配符，它可以匹配任何元素标签、任意属性名称：</p>
<pre class="crayon-plain-tag">&lt;!-- /AAA/CCC/DDD/* 选择所有路径依附于/AAA/CCC/DDD的元素  --&gt;
&lt;AAA&gt;
     &lt;XXX&gt;
          &lt;DDD&gt;
               &lt;BBB/&gt;
               &lt;BBB/&gt;
               &lt;EEE/&gt;
               &lt;FFF/&gt;
          &lt;/DDD&gt;
     &lt;/XXX&gt;
     &lt;CCC&gt;
          &lt;DDD&gt;
               &lt;BBB/&gt; &lt;!--Matches--&gt;
               &lt;BBB/&gt; &lt;!--Matches--&gt;
               &lt;EEE/&gt; &lt;!--Matches--&gt;
               &lt;FFF/&gt; &lt;!--Matches--&gt;
          &lt;/DDD&gt;
     &lt;/CCC&gt;
     &lt;CCC&gt;
          &lt;BBB&gt;
               &lt;BBB&gt;
                    &lt;BBB/&gt;
               &lt;/BBB&gt;
          &lt;/BBB&gt;
     &lt;/CCC&gt;
&lt;/AAA&gt; 

&lt;!-- /*/*/*/BBB 选择所有的有3层祖先元素的BBB元素  --&gt;
&lt;AAA&gt;
     &lt;XXX&gt;
          &lt;DDD&gt;
               &lt;BBB/&gt; &lt;!--Matches--&gt;
               &lt;BBB/&gt; &lt;!--Matches--&gt;
               &lt;EEE/&gt;
               &lt;FFF/&gt;
          &lt;/DDD&gt;
     &lt;/XXX&gt;
     &lt;CCC&gt;
          &lt;DDD&gt;
               &lt;BBB/&gt; &lt;!--Matches--&gt;
               &lt;BBB/&gt; &lt;!--Matches--&gt;
               &lt;EEE/&gt;
               &lt;FFF/&gt;
          &lt;/DDD&gt;
     &lt;/CCC&gt;
     &lt;CCC&gt;
          &lt;BBB&gt;
               &lt;BBB&gt; &lt;!--Matches--&gt;
                    &lt;BBB/&gt;
               &lt;/BBB&gt;
          &lt;/BBB&gt;
     &lt;/CCC&gt;
&lt;/AAA&gt; 

&lt;!-- //* 选择所有元素  --&gt;
&lt;AAA&gt;
     &lt;XXX&gt;
          &lt;DDD&gt;
               &lt;BBB/&gt;
               &lt;BBB/&gt;
               &lt;EEE/&gt;
               &lt;FFF/&gt;
          &lt;/DDD&gt;
     &lt;/XXX&gt;
     &lt;CCC&gt;
          &lt;DDD&gt;
               &lt;BBB/&gt;
               &lt;BBB/&gt;
               &lt;EEE/&gt;
               &lt;FFF/&gt;
          &lt;/DDD&gt;
     &lt;/CCC&gt; 
     &lt;CCC&gt; 
          &lt;BBB&gt; 
               &lt;BBB&gt;
                    &lt;BBB/&gt;
               &lt;/BBB&gt; 
          &lt;/BBB&gt; 
     &lt;/CCC&gt; 
&lt;/AAA&gt;</pre>
<p>方块号<pre class="crayon-plain-tag">[]</pre> 里的子表达式可以进一步的指定元素，其中数字表示元素在选择集里的位置，<pre class="crayon-plain-tag">last()</pre> 函数则表示选择集中的最后一个元素：</p>
<pre class="crayon-plain-tag">&lt;!-- /AAA/BBB[1] 选择AAA的第一个BBB子元素 --&gt;
&lt;AAA&gt;
     &lt;BBB/&gt; &lt;!--Matches--&gt;
     &lt;BBB/&gt;
     &lt;BBB/&gt;
     &lt;BBB/&gt;
&lt;/AAA&gt; 

&lt;!-- /AAA/BBB[last()] 选择AAA的最后一个BBB子元素 --&gt;
&lt;AAA&gt;
     &lt;BBB/&gt;
     &lt;BBB/&gt;
     &lt;BBB/&gt;
     &lt;BBB/&gt; &lt;!--Matches--&gt;
&lt;/AAA&gt;</pre>
<p><pre class="crayon-plain-tag">@</pre> 用于选择元素的属性（而不是元素本身）：</p>
<pre class="crayon-plain-tag">&lt;!-- @id 选择所有元素的id属性 --&gt;
&lt;AAA&gt;
     &lt;BBB id = "b1" matches="true" /&gt;
     &lt;BBB id = "b2" matches="true" /&gt;
     &lt;BBB name = "bbb"/&gt;
     &lt;BBB/&gt;
&lt;/AAA&gt;</pre>
<p>如果<pre class="crayon-plain-tag">@</pre> 位于方括号内部，则用于选择具有特定属性、属性值具有某些特征的元素（本身）：</p>
<pre class="crayon-plain-tag">&lt;!-- //BBB[@id] 选择有id属性的BBB元素  --&gt;
&lt;AAA&gt;
     &lt;BBB id = "b1"/&gt; &lt;!--Matches--&gt;
     &lt;BBB id = "b2"/&gt; &lt;!--Matches--&gt;
     &lt;BBB name = "bbb"/&gt;
     &lt;BBB/&gt;
&lt;/AAA&gt; 

&lt;!-- //BBB[@name] 选择有name属性的BBB元素  --&gt;
&lt;AAA&gt;
     &lt;BBB id = "b1"/&gt;
     &lt;BBB id = "b2"/&gt;
     &lt;BBB name = "bbb"/&gt; &lt;!--Matches--&gt;
     &lt;BBB/&gt;
&lt;/AAA&gt; 

&lt;!-- //BBB[@*] 选择有任意属性的BBB元素  --&gt;
&lt;AAA&gt;
     &lt;BBB id = "b1"/&gt; &lt;!--Matches--&gt;
     &lt;BBB id = "b2"/&gt; &lt;!--Matches--&gt;
     &lt;BBB name = "bbb"/&gt;&lt;!--Matches--&gt;
     &lt;BBB/&gt;
&lt;/AAA&gt; 

&lt;!-- //BBB[not(@*)] 选择没有属性的BBB元素  --&gt;
&lt;AAA&gt;
     &lt;BBB id = "b1"/&gt;
     &lt;BBB id = "b2"/&gt;
     &lt;BBB name = "bbb"/&gt;
     &lt;BBB/&gt; &lt;!--Matches--&gt;
&lt;/AAA&gt; 

&lt;!-- //BBB[@name='bbb'] 选择含有属性name且其值为'bbb'的BBB元素 --&gt;
&lt;AAA&gt;
     &lt;BBB id = "b1"/&gt;
     &lt;BBB name = " bbb "/&gt;
     &lt;BBB name = "bbb"/&gt;&lt;!--Matches--&gt;
&lt;/AAA&gt; 

&lt;!--  //BBB[normalize-space(@name)='bbb']  --&gt;
&lt;!--  选择含有属性name且其值（在用normalize-space函数去掉前后空格后）为'bbb'的BBB元素 /&gt;
&lt;AAA&gt;
     &lt;BBB id = "b1"/&gt;
     &lt;BBB name = " bbb "/&gt; &lt;!--Matches--&gt;
     &lt;BBB name = "bbb"/&gt; &lt;!--Matches--&gt;
&lt;/AAA&gt;</pre>
<p>常见的函数用法：</p>
<pre class="crayon-plain-tag">&lt;!--  count()函数可以计数所选元素的个数  --&gt;
&lt;!--  //*[count(BBB)=2] 选择含有2个BBB子元素的元素  --&gt;
&lt;AAA&gt;
     &lt;CCC&gt;
          &lt;BBB/&gt;
          &lt;BBB/&gt;
          &lt;BBB/&gt;
     &lt;/CCC&gt;
     &lt;DDD&gt; &lt;!--Matches--&gt;
          &lt;BBB/&gt;
          &lt;BBB/&gt;
     &lt;/DDD&gt; &lt;!--Matches--&gt;
     &lt;EEE&gt;
          &lt;CCC/&gt;
          &lt;DDD/&gt;
     &lt;/EEE&gt;
&lt;/AAA&gt; 

&lt;!-- //*[count(*)=2] 选择含有2个子元素的元素 --&gt;
&lt;AAA&gt;
     &lt;CCC&gt;
          &lt;BBB/&gt;
          &lt;BBB/&gt;
          &lt;BBB/&gt;
     &lt;/CCC&gt;
     &lt;DDD&gt; &lt;!--Matches--&gt;
          &lt;BBB/&gt;
          &lt;BBB/&gt;
     &lt;/DDD&gt;
     &lt;EEE&gt; &lt;!--Matches--&gt;
          &lt;CCC/&gt;
          &lt;DDD/&gt;
     &lt;/EEE&gt;
&lt;/AAA&gt; 

&lt;!-- name()函数返回元素的名称， start-with()函数在该函数的第一个参数字符串是以第二个参数字符开始的情况返回true， --&gt;
&lt;!-- contains()函数当其第一个字符串参数包含有第二个字符串参数时返回true --&gt;
&lt;!--  //*[name()='BBB'] 选择所有名称为BBB的元素 --&gt;
&lt;AAA&gt;
     &lt;BCC&gt;
          &lt;BBB/&gt; &lt;!--Matches--&gt;
          &lt;BBB/&gt; &lt;!--Matches--&gt;
          &lt;BBB/&gt; &lt;!--Matches--&gt;
     &lt;/BCC&gt;
     &lt;DDB&gt;
          &lt;BBB/&gt; &lt;!--Matches--&gt;
          &lt;BBB/&gt; &lt;!--Matches--&gt;
     &lt;/DDB&gt;
     &lt;BEC&gt;
          &lt;CCC/&gt;
          &lt;DBD/&gt;
     &lt;/BEC&gt;
&lt;/AAA&gt; 

&lt;!-- //*[starts-with(name(),'B')] 选择所有名称以"B"起始的元素 --&gt;
&lt;AAA&gt;
     &lt;BCC&gt; &lt;!--Matches--&gt;
          &lt;BBB/&gt;&lt;!--Matches--&gt;
          &lt;BBB/&gt; &lt;!--Matches--&gt;
          &lt;BBB/&gt; &lt;!--Matches--&gt;
     &lt;/BCC&gt;
     &lt;DDB&gt;
          &lt;BBB/&gt;&lt;!--Matches--&gt;
          &lt;BBB/&gt;&lt;!--Matches--&gt;
     &lt;/DDB&gt;
     &lt;BEC&gt; &lt;!--Matches--&gt;
          &lt;CCC/&gt;
          &lt;DBD/&gt;
     &lt;/BEC&gt;
&lt;/AAA&gt; 

&lt;!-- //*[contains(name(),'C')] 选择所有名称包含"C"的元素 --&gt;
&lt;AAA&gt;
     &lt;BCC&gt; &lt;!--Matches--&gt;
          &lt;BBB/&gt;
          &lt;BBB/&gt;
          &lt;BBB/&gt;
     &lt;/BCC&gt;
     &lt;DDB&gt;
          &lt;BBB/&gt;
          &lt;BBB/&gt;
     &lt;/DDB&gt;
     &lt;BEC&gt;&lt;!--Matches--&gt;
          &lt;CCC/&gt; &lt;!--Matches--&gt;
          &lt;DBD/&gt;
     &lt;/BEC&gt;
&lt;/AAA&gt; 

&lt;!-- string-length函数返回字符串的字符数,你应该用&lt;替代左尖括号, 用&gt;代替又尖括号 --&gt;
&lt;!-- //*[string-length(name()) = 3] 选择名字长度为3的元素  --&gt;
&lt;AAA&gt; &lt;!--Matches--&gt;
     &lt;Q/&gt;
     &lt;SSSS/&gt;
     &lt;BB/&gt;
     &lt;CCC/&gt;&lt;!--Matches--&gt;
     &lt;DDDDDDDD/&gt;
     &lt;EEEE/&gt;
&lt;/AAA&gt;  

&lt;!-- //*[string-length(name()) &lt; 3] 选择名字长度小于3的元素 --&gt;
&lt;AAA&gt;
     &lt;Q/&gt; &lt;!--Matches--&gt;
     &lt;SSSS/&gt;
     &lt;BB/&gt;&lt;!--Matches--&gt;
     &lt;CCC/&gt;
     &lt;DDDDDDDD/&gt;
     &lt;EEEE/&gt;
&lt;/AAA&gt; 

&lt;!-- div运算符做浮点除法运算, mod运算符做求余运算, floor函数返回不大于参数的最大整数， ceiling返回不小于参数的最小整数 --&gt;
&lt;!-- //BBB[position() mod 2 = 0 ] 选择偶数位置的BBB元素
&lt;AAA&gt;
     &lt;BBB/&gt;
     &lt;BBB/&gt; &lt;!--Matches--&gt;
     &lt;BBB/&gt;
     &lt;BBB/&gt; &lt;!--Matches--&gt;
     &lt;BBB/&gt;
     &lt;BBB/&gt; &lt;!--Matches--&gt;
     &lt;BBB/&gt;
     &lt;BBB/&gt; &lt;!--Matches--&gt;
     &lt;CCC/&gt;
     &lt;CCC/&gt;
     &lt;CCC/&gt;
&lt;/AAA&gt; 

&lt;!-- //BBB[ position() = floor(last() div 2 + 0.5) or position() = ceiling(last() div 2 + 0.5) ] 选择中间的BBB元素 --&gt;
&lt;AAA&gt;
     &lt;BBB/&gt;
     &lt;BBB/&gt;
     &lt;BBB/&gt;
     &lt;BBB/&gt; &lt;!--Matches--&gt;
     &lt;BBB/&gt; &lt;!--Matches--&gt;
     &lt;BBB/&gt;
     &lt;BBB/&gt;
     &lt;BBB/&gt;
     &lt;CCC/&gt;
     &lt;CCC/&gt;
     &lt;CCC/&gt;
&lt;/AAA&gt;</pre>
<p>逻辑或，多个路径可以用分隔符<pre class="crayon-plain-tag">|</pre> 合并在一起：</p>
<pre class="crayon-plain-tag">&lt;!-- 多个路径可以用分隔符 | 合并在一起  --&gt;
&lt;!-- //CCC | //BBB 选择所有的CCC和BBB元素 --&gt;
&lt;AAA&gt;
     &lt;BBB/&gt; &lt;!--Matches--&gt;
     &lt;CCC/&gt; &lt;!--Matches--&gt;
     &lt;DDD&gt;
          &lt;CCC/&gt;&lt;!--Matches--&gt;
     &lt;/DDD&gt;
     &lt;EEE/&gt;
&lt;/AAA&gt; 

&lt;!-- /AAA/EEE | //DDD/CCC | /AAA | //BBB 可以合并的路径数目没有限制  --&gt;
&lt;AAA&gt; &lt;!--Matches--&gt;
     &lt;BBB/&gt;&lt;!--Matches--&gt;
     &lt;CCC/&gt;
     &lt;DDD&gt;
          &lt;CCC/&gt; &lt;!--Matches--&gt;
     &lt;/DDD&gt;
     &lt;EEE/&gt; &lt;!--Matches--&gt;
&lt;/AAA&gt;</pre>
<p>轴描述高级用法举例：</p>
<pre class="crayon-plain-tag">&lt;!-- child轴包含上下文节点的子元素, 作为默认的轴，可以忽略不写  --&gt;
&lt;!-- /AAA 等价于 /child::AAA  --&gt;
&lt;AAA&gt; &lt;!--Matches--&gt;
     &lt;BBB/&gt;
     &lt;CCC/&gt;
&lt;/AAA

&lt;!-- /AAA/BBB 等价于/child::AAA/child::BBB  --&gt;
&lt;AAA&gt;
     &lt;BBB/&gt; &lt;!--Matches--&gt;
     &lt;CCC/&gt;
&lt;/AAA&gt; 

&lt;!-- /child::AAA/child::BBB 等价于/AAA/BBB --&gt;
&lt;AAA&gt;
     &lt;BBB/&gt; &lt;!--Matches--&gt;
     &lt;CCC/&gt;
&lt;/AAA&gt; 

&lt;!-- descendant轴包含上下文节点的后代，一个后代是指子节点或者子节点的子节点等等， --&gt;
&lt;!-- 因此descendant轴不会包含属性和命名空间节点 --&gt;
&lt;!-- /descendant::* 选择文档根元素的所有后代，即所有的元素被选择  --&gt;
&lt;AAA&gt; &lt;!--Matches--&gt;
     &lt;BBB&gt;&lt;!--Matches--&gt;
          &lt;DDD&gt;&lt;!--Matches--&gt;
               &lt;CCC&gt;&lt;!--Matches--&gt;
                    &lt;DDD/&gt;&lt;!--Matches--&gt;
                    &lt;EEE/&gt; &lt;!--Matches--&gt;
               &lt;/CCC&gt;
          &lt;/DDD&gt;
     &lt;/BBB&gt;
     &lt;CCC&gt; &lt;!--Matches--&gt;
          &lt;DDD&gt;&lt;!--Matches--&gt;
               &lt;EEE&gt;&lt;!--Matches--&gt;
                    &lt;DDD&gt;&lt;!--Matches--&gt;
                         &lt;FFF/&gt;&lt;!--Matches--&gt;
                    &lt;/DDD&gt;
               &lt;/EEE&gt;
          &lt;/DDD&gt; 
     &lt;/CCC&gt; 
&lt;/AAA&gt;

&lt;!-- /AAA/BBB/descendant::*选择/AAA/BBB的所有后代元素  --&gt;
&lt;AAA&gt;
     &lt;BBB&gt;
          &lt;DDD&gt; &lt;!--Matches--&gt;
               &lt;CCC&gt;&lt;!--Matches--&gt;
                    &lt;DDD/&gt;&lt;!--Matches--&gt;
                    &lt;EEE/&gt; &lt;!--Matches--&gt;
               &lt;/CCC&gt; 
          &lt;/DDD&gt;
     &lt;/BBB&gt;
     &lt;CCC&gt;
          &lt;DDD&gt;
               &lt;EEE&gt;
                    &lt;DDD&gt;
                         &lt;FFF/&gt;
                    &lt;/DDD&gt;
               &lt;/EEE&gt;
          &lt;/DDD&gt;
     &lt;/CCC&gt;
&lt;/AAA&gt; 

&lt;!-- //CCC/descendant::* 选择在祖先元素中有CCC的所有元素  --&gt;
&lt;AAA&gt;
     &lt;BBB&gt;
          &lt;DDD&gt;
               &lt;CCC&gt;
                    &lt;DDD/&gt; &lt;!--Matches--&gt;
                    &lt;EEE/&gt; &lt;!--Matches--&gt;
               &lt;/CCC&gt;
          &lt;/DDD&gt;
     &lt;/BBB&gt;
     &lt;CCC&gt;
          &lt;DDD&gt; &lt;!--Matches--&gt;
               &lt;EEE&gt;&lt;!--Matches--&gt;
                    &lt;DDD&gt;&lt;!--Matches--&gt;
                         &lt;FFF/&gt;&lt;!--Matches--&gt;
                    &lt;/DDD&gt;
               &lt;/EEE&gt; 
          &lt;/DDD&gt; 
     &lt;/CCC&gt;
&lt;/AAA&gt; 

&lt;!-- //CCC/descendant::DDD 选择所有以CCC为祖先元素的DDD元素  --&gt;
&lt;AAA&gt;
     &lt;BBB&gt;
          &lt;DDD&gt;
               &lt;CCC&gt;
                    &lt;DDD/&gt; &lt;!--Matches--&gt;
                    &lt;EEE/&gt;
               &lt;/CCC&gt;
          &lt;/DDD&gt;
     &lt;/BBB&gt;
     &lt;CCC&gt;
          &lt;DDD&gt; &lt;!--Matches--&gt;
               &lt;EEE&gt;
                    &lt;DDD&gt;&lt;!--Matches--&gt;
                         &lt;FFF/&gt;
                    &lt;/DDD&gt;
               &lt;/EEE&gt;
          &lt;/DDD&gt;
     &lt;/CCC&gt;
&lt;/AAA&gt; 

&lt;!-- parent轴包含上下文节点的父节点, 如果有父节点的话 --&gt;
&lt;!-- //DDD/parent::* 选择DDD元素的所有父节点 --&gt;
&lt;AAA&gt;
     &lt;BBB&gt; &lt;!--Matches--&gt;
          &lt;DDD&gt;
               &lt;CCC&gt;&lt;!--Matches--&gt;
                    &lt;DDD/&gt;
                    &lt;EEE/&gt;
               &lt;/CCC&gt;
          &lt;/DDD&gt;
     &lt;/BBB&gt; &lt;!--Matches--&gt;
     &lt;CCC&gt; &lt;!--Matches--&gt;
          &lt;DDD&gt;
               &lt;EEE&gt;&lt;!--Matches--&gt;
                    &lt;DDD&gt;
                         &lt;FFF/&gt;
                    &lt;/DDD&gt;
               &lt;/EEE&gt; 
          &lt;/DDD&gt;
     &lt;/CCC&gt;
&lt;/AAA&gt; 

&lt;!-- ancestor轴包含上下节点的祖先节点, 该祖先节点由其上下文节点的父节点以及 --&gt;
&lt;!-- 父节点的父节点等等诸如此类的节点构成,所以ancestor轴总是包含有根节点,除非上下文节点就是根节点本身 --&gt;
&lt;!-- /AAA/BBB/DDD/CCC/EEE/ancestor::* 选择一个绝对路径上的所有节点 --&gt;
&lt;AAA&gt; &lt;!--Matches--&gt;
     &lt;BBB&gt;&lt;!--Matches--&gt;
          &lt;DDD&gt;&lt;!--Matches--&gt;
               &lt;CCC&gt;&lt;!--Matches--&gt;
                    &lt;DDD/&gt;
                    &lt;EEE/&gt;
               &lt;/CCC&gt;
          &lt;/DDD&gt;
     &lt;/BBB&gt; 
     &lt;CCC&gt;
          &lt;DDD&gt;
               &lt;EEE&gt;
                    &lt;DDD&gt;
                         &lt;FFF/&gt;
                    &lt;/DDD&gt;
               &lt;/EEE&gt;
          &lt;/DDD&gt;
     &lt;/CCC&gt;
&lt;/AAA&gt; 

&lt;!-- //FFF/ancestor::* 选择FFF元素的祖先节点  --&gt;
&lt;AAA&gt; &lt;!--Matches--&gt;
     &lt;BBB&gt;
          &lt;DDD&gt;
               &lt;CCC&gt;
                    &lt;DDD/&gt;
                    &lt;EEE/&gt;
               &lt;/CCC&gt;
          &lt;/DDD&gt;
     &lt;/BBB&gt;
     &lt;CCC&gt; &lt;!--Matches--&gt;
          &lt;DDD&gt;&lt;!--Matches--&gt;
               &lt;EEE&gt;&lt;!--Matches--&gt;
                    &lt;DDD&gt;&lt;!--Matches--&gt;
                         &lt;FFF/&gt;
                    &lt;/DDD&gt; 
               &lt;/EEE&gt;
          &lt;/DDD&gt; 
     &lt;/CCC&gt; 
&lt;/AAA&gt;  

&lt;!-- following-sibling轴包含上下文节点之后的所有兄弟节点 --&gt;
&lt;!-- /AAA/BBB/following-sibling::* --&gt;
&lt;AAA&gt;
     &lt;BBB&gt;
          &lt;CCC/&gt;
          &lt;DDD/&gt;
     &lt;/BBB&gt;
     &lt;XXX&gt; &lt;!--Matches--&gt;
          &lt;DDD&gt;
               &lt;EEE/&gt;
               &lt;DDD/&gt;
               &lt;CCC/&gt;
               &lt;FFF/&gt;
               &lt;FFF&gt;
                    &lt;GGG/&gt;
               &lt;/FFF&gt;
          &lt;/DDD&gt;
     &lt;/XXX&gt;
     &lt;CCC&gt; &lt;!--Matches--&gt;
          &lt;DDD/&gt;
     &lt;/CCC&gt;
&lt;/AAA&gt; 

&lt;!-- //CCC/following-sibling::* --&gt;
&lt;AAA&gt;
     &lt;BBB&gt;
          &lt;CCC/&gt;
          &lt;DDD/&gt;&lt;!--Matches--&gt;
     &lt;/BBB&gt;
     &lt;XXX&gt;
          &lt;DDD&gt;
               &lt;EEE/&gt;
               &lt;DDD/&gt;
               &lt;CCC/&gt;
               &lt;FFF/&gt; &lt;!--Matches--&gt;
               &lt;FFF&gt; &lt;!--Matches--&gt;
                    &lt;GGG/&gt;
               &lt;/FFF&gt; 
          &lt;/DDD&gt;
     &lt;/XXX&gt;
     &lt;CCC&gt;
          &lt;DDD/&gt;
     &lt;/CCC&gt;
&lt;/AAA&gt; 

&lt;!-- preceding-sibling 轴包含上下文节点之前的所有兄弟节点 --&gt;
&lt;!-- /AAA/XXX/preceding-sibling::*  --&gt;
&lt;AAA&gt;
     &lt;BBB&gt; &lt;!--Matches--&gt;
          &lt;CCC/&gt;
          &lt;DDD/&gt;
     &lt;/BBB&gt; 
     &lt;XXX&gt;
          &lt;DDD&gt;
               &lt;EEE/&gt;
               &lt;DDD/&gt;
               &lt;CCC/&gt;
               &lt;FFF/&gt;
               &lt;FFF&gt;
                    &lt;GGG/&gt;
               &lt;/FFF&gt;
          &lt;/DDD&gt;
     &lt;/XXX&gt;
     &lt;CCC&gt;
          &lt;DDD/&gt;
     &lt;/CCC&gt;
&lt;/AAA&gt; 

&lt;!-- //CCC/preceding-sibling::* --&gt;
&lt;AAA&gt;
     &lt;BBB&gt; &lt;!--Matches--&gt;
          &lt;CCC/&gt;
          &lt;DDD/&gt;
     &lt;/BBB&gt; &lt;!--Matches--&gt;
     &lt;XXX&gt; &lt;!--Matches--&gt;
          &lt;DDD&gt;
               &lt;EEE/&gt;&lt;!--Matches--&gt;
               &lt;DDD/&gt;&lt;!--Matches--&gt;
               &lt;CCC/&gt;
               &lt;FFF/&gt;
               &lt;FFF&gt;
                    &lt;GGG/&gt;
               &lt;/FFF&gt;
          &lt;/DDD&gt;
     &lt;/XXX&gt; 
     &lt;CCC&gt;
          &lt;DDD/&gt;
     &lt;/CCC&gt;
&lt;/AAA&gt; 


&lt;!-- following轴(axis)包含同一文档中按文档顺序位于上下文节点之后的所有节点, 除了祖先节点,属性节点和命名空间节点  --&gt;
&lt;!-- /AAA/XXX/following::* --&gt;
&lt;AAA&gt;
     &lt;BBB&gt;
          &lt;CCC/&gt;
          &lt;ZZZ&gt;
               &lt;DDD/&gt;
               &lt;DDD&gt;
                    &lt;EEE/&gt;
               &lt;/DDD&gt;
          &lt;/ZZZ&gt;
          &lt;FFF&gt;
               &lt;GGG/&gt;
          &lt;/FFF&gt;
     &lt;/BBB&gt;
     &lt;XXX&gt;
          &lt;DDD&gt;
               &lt;EEE/&gt;
               &lt;DDD/&gt;
               &lt;CCC/&gt;
               &lt;FFF/&gt;
               &lt;FFF&gt;
                    &lt;GGG/&gt;
               &lt;/FFF&gt;
          &lt;/DDD&gt;
     &lt;/XXX&gt;
     &lt;CCC&gt; &lt;!--Matches--&gt;
          &lt;DDD/&gt;&lt;!--Matches--&gt;
     &lt;/CCC&gt; 
&lt;/AAA&gt; 

&lt;!-- //ZZZ/following::*  --&gt;
&lt;AAA&gt;
     &lt;BBB&gt;
          &lt;CCC/&gt;
          &lt;ZZZ&gt;
               &lt;DDD/&gt;
               &lt;DDD&gt;
                    &lt;EEE/&gt;
               &lt;/DDD&gt;
          &lt;/ZZZ&gt;
          &lt;FFF&gt; &lt;!--Matches--&gt;
               &lt;GGG/&gt;&lt;!--Matches--&gt;
          &lt;/FFF&gt;  
     &lt;/BBB&gt;
     &lt;XXX&gt; &lt;!--Matches--&gt;
          &lt;DDD&gt;&lt;!--Matches--&gt;
               &lt;EEE/&gt;&lt;!--Matches--&gt;
               &lt;DDD/&gt;&lt;!--Matches--&gt;
               &lt;CCC/&gt; &lt;!--Matches--&gt;
               &lt;FFF/&gt; &lt;!--Matches--&gt;
               &lt;FFF&gt; &lt;!--Matches--&gt;
                    &lt;GGG/&gt;&lt;!--Matches--&gt;
               &lt;/FFF&gt;  
          &lt;/DDD&gt; 
     &lt;/XXX&gt; 
     &lt;CCC&gt; &lt;!--Matches--&gt;
          &lt;DDD/&gt;&lt;!--Matches--&gt;
     &lt;/CCC&gt;
&lt;/AAA&gt; 

&lt;!-- following轴包含同一文档中按文档顺序位于上下文节点之前的所有节点, 除了祖先节点,属性节点和命名空间节点 --&gt;
&lt;!-- /AAA/XXX/preceding::* --&gt;
&lt;AAA&gt;
     &lt;BBB&gt; &lt;!--Matches--&gt;
          &lt;CCC/&gt;&lt;!--Matches--&gt;
          &lt;ZZZ&gt; &lt;!--Matches--&gt;
               &lt;DDD/&gt;&lt;!--Matches--&gt;
          &lt;/ZZZ&gt;  
     &lt;/BBB&gt;  
     &lt;XXX&gt;
          &lt;DDD&gt;
               &lt;EEE/&gt;
               &lt;DDD/&gt;
               &lt;CCC/&gt;
               &lt;FFF/&gt;
               &lt;FFF&gt;
                    &lt;GGG/&gt;
               &lt;/FFF&gt;
          &lt;/DDD&gt;
     &lt;/XXX&gt;
     &lt;CCC&gt;
          &lt;DDD/&gt;
     &lt;/CCC&gt;
&lt;/AAA&gt; 

&lt;!-- //GGG/preceding::*  --&gt;
&lt;AAA&gt;
     &lt;BBB&gt; &lt;!--Matches--&gt;
          &lt;CCC/&gt;&lt;!--Matches--&gt;
          &lt;ZZZ&gt; &lt;!--Matches--&gt;
               &lt;DDD/&gt;&lt;!--Matches--&gt;
          &lt;/ZZZ&gt;  
     &lt;/BBB&gt; 
     &lt;XXX&gt;
          &lt;DDD&gt;
               &lt;EEE/&gt; &lt;!--Matches--&gt;
               &lt;DDD/&gt; &lt;!--Matches--&gt;
               &lt;CCC/&gt; &lt;!--Matches--&gt;
               &lt;FFF/&gt; &lt;!--Matches--&gt;
               &lt;FFF&gt;
                    &lt;GGG/&gt;
               &lt;/FFF&gt;
          &lt;/DDD&gt;
     &lt;/XXX&gt;
     &lt;CCC&gt;
          &lt;DDD/&gt;
     &lt;/CCC&gt;
&lt;/AAA&gt; 

&lt;!-- descendant-or-self 轴包含上下文节点本身和该节点的后代节点 --&gt;
&lt;!-- /AAA/XXX/descendant-or-self::*  --&gt;
&lt;AAA&gt;
     &lt;BBB&gt;
          &lt;CCC/&gt;
          &lt;ZZZ&gt;
               &lt;DDD/&gt;
          &lt;/ZZZ&gt;
     &lt;/BBB&gt;
     &lt;XXX&gt; &lt;!--Matches--&gt;
          &lt;DDD&gt;&lt;!--Matches--&gt;
               &lt;EEE/&gt;&lt;!--Matches--&gt;
               &lt;DDD/&gt;&lt;!--Matches--&gt;
               &lt;CCC/&gt; &lt;!--Matches--&gt;
               &lt;FFF/&gt; &lt;!--Matches--&gt;
               &lt;FFF&gt; &lt;!--Matches--&gt;
                    &lt;GGG/&gt;&lt;!--Matches--&gt;
               &lt;/FFF&gt;  
          &lt;/DDD&gt;  
     &lt;/XXX&gt;  
     &lt;CCC&gt;
          &lt;DDD/&gt;
     &lt;/CCC&gt;
&lt;/AAA&gt; 

&lt;!-- //CCC/descendant-or-self::*  --&gt;
&lt;AAA&gt;
     &lt;BBB&gt;
          &lt;CCC/&gt; &lt;!--Matches--&gt;
          &lt;ZZZ&gt;
               &lt;DDD/&gt;
          &lt;/ZZZ&gt;
     &lt;/BBB&gt;
     &lt;XXX&gt;
          &lt;DDD&gt;
               &lt;EEE/&gt;
               &lt;DDD/&gt;
               &lt;CCC/&gt; &lt;!--Matches--&gt;
               &lt;FFF/&gt;
               &lt;FFF&gt;
                    &lt;GGG/&gt;
               &lt;/FFF&gt;
          &lt;/DDD&gt;
     &lt;/XXX&gt;
     &lt;CCC&gt; &lt;!--Matches--&gt;
          &lt;DDD/&gt;&lt;!--Matches--&gt;
     &lt;/CCC&gt; 
&lt;/AAA&gt; 

&lt;!-- ancestor-or-self 轴包含上下文节点本身和该节点的祖先节点 --&gt;
&lt;!-- /AAA/XXX/DDD/EEE/ancestor-or-self::*  --&gt;
&lt;AAA&gt; &lt;!--Matches--&gt;
     &lt;BBB&gt;
          &lt;CCC/&gt;
          &lt;ZZZ&gt;
               &lt;DDD/&gt;
          &lt;/ZZZ&gt;
     &lt;/BBB&gt;
     &lt;XXX&gt; &lt;!--Matches--&gt;
          &lt;DDD&gt;&lt;!--Matches--&gt;
               &lt;EEE/&gt;&lt;!--Matches--&gt;
               &lt;DDD/&gt;
               &lt;CCC/&gt;
               &lt;FFF/&gt;
               &lt;FFF&gt;
                    &lt;GGG/&gt;
               &lt;/FFF&gt;
          &lt;/DDD&gt; &lt;!--Matches--&gt;
     &lt;/XXX&gt;  
     &lt;CCC&gt;
          &lt;DDD/&gt;
     &lt;/CCC&gt;
&lt;/AAA&gt;  &lt;!--Matches--&gt;

&lt;!-- GGG/ancestor-or-self::*  --&gt;
&lt;AAA&gt; &lt;!--Matches--&gt;
     &lt;BBB&gt;
          &lt;CCC/&gt;
          &lt;ZZZ&gt;
               &lt;DDD/&gt;
          &lt;/ZZZ&gt;
     &lt;/BBB&gt;
     &lt;XXX&gt; &lt;!--Matches--&gt;
          &lt;DDD&gt;&lt;!--Matches--&gt;
               &lt;EEE/&gt;
               &lt;DDD/&gt;
               &lt;CCC/&gt;
               &lt;FFF/&gt;
               &lt;FFF&gt; &lt;!--Matches--&gt;
                    &lt;GGG/&gt; &lt;!--Matches--&gt;
               &lt;/FFF&gt; 
          &lt;/DDD&gt;  
     &lt;/XXX&gt;  
     &lt;CCC&gt;
          &lt;DDD/&gt;
     &lt;/CCC&gt;
&lt;/AAA&gt;  

&lt;!-- 
    ancestor, descendant, following, preceding 和self轴(axis)分割了XML文档(忽略属性节点和命名空间节点), 
    不能交迭,而一起使用则包含所有节点  
--&gt;
&lt;!-- //GGG/ancestor::*  --&gt;
&lt;AAA&gt; &lt;!--Matches--&gt;
     &lt;BBB&gt;
          &lt;CCC/&gt;
          &lt;ZZZ/&gt;
     &lt;/BBB&gt;
     &lt;XXX&gt;&lt;!--Matches--&gt;
          &lt;DDD&gt;&lt;!--Matches--&gt;
               &lt;EEE/&gt;
               &lt;FFF&gt;&lt;!--Matches--&gt;
                    &lt;HHH/&gt;
                    &lt;GGG&gt;
                         &lt;JJJ&gt;
                              &lt;QQQ/&gt;
                         &lt;/JJJ&gt;
                         &lt;JJJ/&gt;
                    &lt;/GGG&gt;
                    &lt;HHH/&gt;
               &lt;/FFF&gt;  
          &lt;/DDD&gt;  
     &lt;/XXX&gt; 
     &lt;CCC&gt;
          &lt;DDD/&gt;
     &lt;/CCC&gt;
&lt;/AAA&gt; 

&lt;!-- //GGG/descendant::*  --&gt;
&lt;AAA&gt;
     &lt;BBB&gt;
          &lt;CCC/&gt;
          &lt;ZZZ/&gt;
     &lt;/BBB&gt;
     &lt;XXX&gt;
          &lt;DDD&gt;
               &lt;EEE/&gt;
               &lt;FFF&gt;
                    &lt;HHH/&gt;
                    &lt;GGG&gt;
                         &lt;JJJ&gt; &lt;!--Matches--&gt;
                              &lt;QQQ/&gt;&lt;!--Matches--&gt;
                         &lt;/JJJ&gt;  
                         &lt;JJJ/&gt; &lt;!--Matches--&gt;
                    &lt;/GGG&gt;
                    &lt;HHH/&gt;
               &lt;/FFF&gt;
          &lt;/DDD&gt;
     &lt;/XXX&gt;
     &lt;CCC&gt;
          &lt;DDD/&gt;
     &lt;/CCC&gt;
&lt;/AAA&gt; 

&lt;!-- //GGG/following::*  --&gt;
&lt;AAA&gt;
     &lt;BBB&gt;
          &lt;CCC/&gt;
          &lt;ZZZ/&gt;
     &lt;/BBB&gt;
     &lt;XXX&gt;
          &lt;DDD&gt;
               &lt;EEE/&gt;
               &lt;FFF&gt;
                    &lt;HHH/&gt;
                    &lt;GGG&gt;
                         &lt;JJJ&gt;
                              &lt;QQQ/&gt;
                         &lt;/JJJ&gt;
                         &lt;JJJ/&gt;
                    &lt;/GGG&gt;
                    &lt;HHH/&gt; &lt;!--Matches--&gt;
               &lt;/FFF&gt;
          &lt;/DDD&gt;
     &lt;/XXX&gt;
     &lt;CCC&gt; &lt;!--Matches--&gt;
          &lt;DDD/&gt;&lt;!--Matches--&gt;
     &lt;/CCC&gt;  
&lt;/AAA&gt; 

&lt;!-- //GGG/preceding::*
&lt;AAA&gt;
     &lt;BBB&gt; &lt;!--Matches--&gt;
          &lt;CCC/&gt;&lt;!--Matches--&gt;
          &lt;ZZZ/&gt; &lt;!--Matches--&gt;
     &lt;/BBB&gt;  
     &lt;XXX&gt;
          &lt;DDD&gt;
               &lt;EEE/&gt; &lt;!--Matches--&gt;
               &lt;FFF&gt;
                    &lt;HHH/&gt;&lt;!--Matches--&gt;
                    &lt;GGG&gt;
                         &lt;JJJ&gt;
                              &lt;QQQ/&gt;
                         &lt;/JJJ&gt;
                         &lt;JJJ/&gt;
                    &lt;/GGG&gt;
                    &lt;HHH/&gt;
               &lt;/FFF&gt;
          &lt;/DDD&gt;
     &lt;/XXX&gt;
     &lt;CCC&gt;
          &lt;DDD/&gt;
     &lt;/CCC&gt;
&lt;/AAA&gt; 

&lt;!-- //GGG/self::*  --&gt;
&lt;AAA&gt;
     &lt;BBB&gt;
          &lt;CCC/&gt;
          &lt;ZZZ/&gt;
     &lt;/BBB&gt;
     &lt;XXX&gt;
          &lt;DDD&gt;
               &lt;EEE/&gt;
               &lt;FFF&gt;
                    &lt;HHH/&gt;
                    &lt;GGG&gt; &lt;!--Matches--&gt;
                         &lt;JJJ&gt;
                              &lt;QQQ/&gt;
                         &lt;/JJJ&gt;
                         &lt;JJJ/&gt;
                    &lt;/GGG&gt; 
                    &lt;HHH/&gt;
               &lt;/FFF&gt;
          &lt;/DDD&gt;
     &lt;/XXX&gt;
     &lt;CCC&gt;
          &lt;DDD/&gt;
     &lt;/CCC&gt;
&lt;/AAA&gt; 

&lt;!-- //GGG/ancestor::* | //GGG/descendant::* | //GGG/following::* | //GGG/preceding::* | //GGG/self::*  --&gt;
&lt;AAA&gt; &lt;!--Matches--&gt;
     &lt;BBB&gt;&lt;!--Matches--&gt;
          &lt;CCC/&gt;&lt;!--Matches--&gt;
          &lt;ZZZ/&gt; &lt;!--Matches--&gt;
     &lt;/BBB&gt; 
     &lt;XXX&gt; &lt;!--Matches--&gt;
          &lt;DDD&gt;&lt;!--Matches--&gt;
               &lt;EEE/&gt;&lt;!--Matches--&gt;
               &lt;FFF&gt; &lt;!--Matches--&gt;
                    &lt;HHH/&gt;&lt;!--Matches--&gt;
                    &lt;GGG&gt; &lt;!--Matches--&gt;
                         &lt;JJJ&gt; &lt;!--Matches--&gt;
                              &lt;QQQ/&gt;&lt;!--Matches--&gt;
                         &lt;/JJJ&gt; 
                         &lt;JJJ/&gt; &lt;!--Matches--&gt;
                    &lt;/GGG&gt; 
                    &lt;HHH/&gt; &lt;!--Matches--&gt;
               &lt;/FFF&gt; 
          &lt;/DDD&gt; 
     &lt;/XXX&gt; 
     &lt;CCC&gt; &lt;!--Matches--&gt;
          &lt;DDD/&gt;&lt;!--Matches--&gt;
     &lt;/CCC&gt;
&lt;/AAA&gt; &lt;br&gt;</pre>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/xpath-faq">XPath知识集锦</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/xpath-faq/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dom4j知识集锦</title>
		<link>https://blog.gmem.cc/dom4j-faq</link>
		<comments>https://blog.gmem.cc/dom4j-faq#comments</comments>
		<pubDate>Thu, 17 Feb 2011 06:54:41 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Dom4j]]></category>
		<category><![CDATA[DTD]]></category>
		<category><![CDATA[FAQ]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[XPath]]></category>
		<category><![CDATA[XSD]]></category>

		<guid isPermaLink="false">http://blog.gmem.cc/?p=1542</guid>
		<description><![CDATA[<p>如何禁止加载XSD和DTD [crayon-69e5935d2d0d8909838904/] DTD验证，无法联网时报错 通过指定本地的DTD文档来解决： [crayon-69e5935d2d0dc094060093/] 使用JAXP来进行XSD验证 [crayon-69e5935d2d0de771198913/] Dom4j如何格式化XML输出 [crayon-69e5935d2d0e0158740943/] 如何使用XPath解析带名字空间的XML [crayon-69e5935d2d0e2524080390/] Dom4j访问者模式中，删除节点导致NullPointerException 报错：java.lang.NullPointerException at org.dom4j.tree.AbstractElement.accept(AbstractElement.java:208) 解决：在访问者中记录需要删除的节点，访问结束后一起删除。</p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/dom4j-faq">Dom4j知识集锦</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div class="blog_h3"><span class="graybg">如何禁止加载XSD和DTD</span></div>
<pre class="crayon-plain-tag">SAXReader reader = new SAXReader( true );
reader.setFeature( Constants.XERCES_FEATURE_PREFIX + Constants.LOAD_EXTERNAL_DTD_FEATURE, false );</pre>
<div class="blog_h3"><span class="graybg">DTD验证，无法联网时报错</span></div>
通过指定本地的DTD文档来解决：<br />
<pre class="crayon-plain-tag">SAXReader reader = new SAXReader( true );
reader.setEntityResolver( new EntityResolver() {

    public InputSource resolveEntity( String publicId, String systemId )
    {
        if ( publicId.equals( "-//Hibernate/Hibernate Mapping DTD 3.0//EN" ) )
        {
            InputStream in = getClass().getResourceAsStream( "/hibernate-mapping-3.0.dtd" );
            return new InputSource( in );
        }
        return null;
    }
} );</pre>
<div class="blog_h3"><span class="graybg">使用JAXP来进行XSD验证</span></div>
<pre class="crayon-plain-tag">InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream( XSD_FILE_PATH );
javax.xml.validation.SchemaFactory factory = SchemaFactory.newInstance( XMLConstants.W3C_XML_SCHEMA_NS_URI );
new StreamSource( is ) ).newValidator();
validator.validate( new StreamSource( new StringReader( xml ) ) );</pre>
<div class="blog_h3"><span class="graybg">Dom4j如何格式化XML输出</span></div>
<pre class="crayon-plain-tag">StringWriter sw = new StringWriter();
XMLWriter writer = new XMLWriter( sw, OutputFormat.createPrettyPrint() );
try
{
    writer.write( doc );
}
catch ( IOException e )
{
    // impossible
}</pre>
<div class="blog_h3"><span class="graybg">如何使用XPath解析带名字空间的XML</span></div>
<pre class="crayon-plain-tag">SAXReader reader = new SAXReader();
Map&lt;String, String&gt; nameSpaceMap = new HashMap&lt;String, String&gt;();
nameSpaceMap.put( "beans", "http://www.springframework.org/schema/beans" );
reader.getDocumentFactory().setXPathNamespaceURIs( nameSpaceMap );
Document doc = reader.read( new ClassPathResource( APP_CTX_FILE_NAME ).getInputStream() );
Element e = (Element) doc.getRootElement().selectSingleNode("beans:bean[@id='canaryConfig']/beans:property[@name='baseDir']" );
bd = e.attributeValue( "value" );</pre>
<div class="blog_h3"><span class="graybg">Dom4j访问者模式中，删除节点导致NullPointerException</span></div>
<p>报错：java.lang.NullPointerException at org.dom4j.tree.AbstractElement.accept(AbstractElement.java:208)<br />
解决：在访问者中记录需要删除的节点，访问结束后一起删除。</p>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/dom4j-faq">Dom4j知识集锦</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/dom4j-faq/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
