File: C:/Ruby27-x64/share/doc/ruby/html/REXML/Parsers/XPathParser.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>class REXML::Parsers::XPathParser - RDoc Documentation</title>
<script type="text/javascript">
var rdoc_rel_prefix = "../../";
var index_rel_prefix = "../../";
</script>
<script src="../../js/navigation.js" defer></script>
<script src="../../js/search.js" defer></script>
<script src="../../js/search_index.js" defer></script>
<script src="../../js/searcher.js" defer></script>
<script src="../../js/darkfish.js" defer></script>
<link href="../../css/fonts.css" rel="stylesheet">
<link href="../../css/rdoc.css" rel="stylesheet">
<body id="top" role="document" class="class">
<nav role="navigation">
<div id="project-navigation">
<div id="home-section" role="region" title="Quick navigation" class="nav-section">
<h2>
<a href="../../index.html" rel="home">Home</a>
</h2>
<div id="table-of-contents-navigation">
<a href="../../table_of_contents.html#pages">Pages</a>
<a href="../../table_of_contents.html#classes">Classes</a>
<a href="../../table_of_contents.html#methods">Methods</a>
</div>
</div>
<div id="search-section" role="search" class="project-section initially-hidden">
<form action="#" method="get" accept-charset="utf-8">
<div id="search-field-wrapper">
<input id="search-field" role="combobox" aria-label="Search"
aria-autocomplete="list" aria-controls="search-results"
type="text" name="search" placeholder="Search" spellcheck="false"
title="Type to search, Up and Down to navigate, Enter to load">
</div>
<ul id="search-results" aria-label="Search Results"
aria-busy="false" aria-expanded="false"
aria-atomic="false" class="initially-hidden"></ul>
</form>
</div>
</div>
<div id="class-metadata">
<div id="parent-class-section" class="nav-section">
<h3>Parent</h3>
<p class="link"><a href="../../Object.html">Object</a>
</div>
<div id="includes-section" class="nav-section">
<h3>Included Modules</h3>
<ul class="link-list">
<li><a class="include" href="../XMLTokens.html">REXML::XMLTokens</a>
</ul>
</div>
<!-- Method Quickref -->
<div id="method-list-section" class="nav-section">
<h3>Methods</h3>
<ul class="link-list" role="directory">
<li ><a href="#method-i-AdditiveExpr">#AdditiveExpr</a>
<li ><a href="#method-i-AndExpr">#AndExpr</a>
<li ><a href="#method-i-EqualityExpr">#EqualityExpr</a>
<li ><a href="#method-i-FilterExpr">#FilterExpr</a>
<li ><a href="#method-i-FunctionCall">#FunctionCall</a>
<li ><a href="#method-i-LocationPath">#LocationPath</a>
<li ><a href="#method-i-MultiplicativeExpr">#MultiplicativeExpr</a>
<li ><a href="#method-i-NodeTest">#NodeTest</a>
<li ><a href="#method-i-OrExpr">#OrExpr</a>
<li ><a href="#method-i-PathExpr">#PathExpr</a>
<li ><a href="#method-i-Predicate">#Predicate</a>
<li ><a href="#method-i-PrimaryExpr">#PrimaryExpr</a>
<li ><a href="#method-i-RelationalExpr">#RelationalExpr</a>
<li ><a href="#method-i-RelativeLocationPath">#RelativeLocationPath</a>
<li ><a href="#method-i-UnaryExpr">#UnaryExpr</a>
<li ><a href="#method-i-UnionExpr">#UnionExpr</a>
<li ><a href="#method-i-abbreviate">#abbreviate</a>
<li ><a href="#method-i-expand">#expand</a>
<li ><a href="#method-i-get_group">#get_group</a>
<li ><a href="#method-i-namespaces-3D">#namespaces=</a>
<li ><a href="#method-i-parse">#parse</a>
<li ><a href="#method-i-parse_args">#parse_args</a>
<li ><a href="#method-i-predicate">#predicate</a>
<li ><a href="#method-i-predicate_to_string">#predicate_to_string</a>
</ul>
</div>
</div>
</nav>
<main role="main" aria-labelledby="class-REXML::Parsers::XPathParser">
<h1 id="class-REXML::Parsers::XPathParser" class="class">
class REXML::Parsers::XPathParser
</h1>
<section class="description">
<p>You don't want to use this class. Really. Use <a href="../XPath.html"><code>XPath</code></a>, which is a wrapper for this class. Believe me. You don't want to poke around in here. There is strange, dark magic at work in this code. Beware. Go back! Go back while you still can!</p>
</section>
<section id="5Buntitled-5D" class="documentation-section">
<section class="constants-list">
<header>
<h3>Constants</h3>
</header>
<dl>
<dt id="AXIS">AXIS
<dd><p><a href="XPathParser.html#method-i-RelativeLocationPath"><code>RelativeLocationPath</code></a></p>
<pre>| Step
| (AXIS_NAME '::' | '@' | '') AxisSpecifier
NodeTest
Predicate
| '.' | '..' AbbreviatedStep
| RelativeLocationPath '/' Step
| RelativeLocationPath '//' Step</pre>
<dt id="LITERAL">LITERAL
<dd>
<dt id="LOCAL_NAME_WILDCARD">LOCAL_NAME_WILDCARD
<dd>
<dt id="NODE_TYPE">NODE_TYPE
<dd>
<dt id="NT">NT
<dd>
<dt id="NUMBER">NUMBER
<dd>
<dt id="PI">PI
<dd>
<dt id="PREFIX_WILDCARD">PREFIX_WILDCARD
<dd><pre>Returns a 1-1 map of the nodeset
The contents of the resulting array are either:
true/false, if a positive match
String, if a name match</pre>
<p><a href="XPathParser.html#method-i-NodeTest"><code>NodeTest</code></a></p>
<pre>| ('*' | NCNAME ':' '*' | QNAME) NameTest
| '*' ':' NCNAME NameTest since XPath 2.0
| NODE_TYPE '(' ')' NodeType
| PI '(' LITERAL ')' PI
| '[' expr ']' Predicate</pre>
<dt id="QNAME">QNAME
<dd>
<dt id="VARIABLE_REFERENCE">VARIABLE_REFERENCE
<dd><p>| <a href="XPathParser.html#VARIABLE_REFERENCE"><code>VARIABLE_REFERENCE</code></a> | '(' expr ')' | <a href="XPathParser.html#LITERAL"><code>LITERAL</code></a> | <a href="XPathParser.html#NUMBER"><code>NUMBER</code></a> | <a href="XPathParser.html#method-i-FunctionCall"><code>FunctionCall</code></a></p>
</dl>
</section>
<section id="public-instance-5Buntitled-5D-method-details" class="method-section">
<header>
<h3>Public Instance Methods</h3>
</header>
<div id="method-i-abbreviate" class="method-detail ">
<div class="method-heading">
<span class="method-name">abbreviate</span><span
class="method-args">( path )</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<div class="method-source-code" id="abbreviate-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/xpathparser.rb, line 35</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">abbreviate</span>( <span class="ruby-identifier">path</span> )
<span class="ruby-identifier">path</span> = <span class="ruby-identifier">path</span>.<span class="ruby-identifier">kind_of?</span>(<span class="ruby-constant">String</span>) <span class="ruby-operator">?</span> <span class="ruby-identifier">parse</span>( <span class="ruby-identifier">path</span> ) <span class="ruby-operator">:</span> <span class="ruby-identifier">path</span>
<span class="ruby-identifier">string</span> = <span class="ruby-string">""</span>
<span class="ruby-identifier">document</span> = <span class="ruby-keyword">false</span>
<span class="ruby-keyword">while</span> <span class="ruby-identifier">path</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
<span class="ruby-identifier">op</span> = <span class="ruby-identifier">path</span>.<span class="ruby-identifier">shift</span>
<span class="ruby-keyword">case</span> <span class="ruby-identifier">op</span>
<span class="ruby-keyword">when</span> <span class="ruby-value">:node</span>
<span class="ruby-keyword">when</span> <span class="ruby-value">:attribute</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-string">"/"</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">string</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-string">"@"</span>
<span class="ruby-keyword">when</span> <span class="ruby-value">:child</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-string">"/"</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">string</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
<span class="ruby-keyword">when</span> <span class="ruby-value">:descendant_or_self</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-string">"/"</span>
<span class="ruby-keyword">when</span> <span class="ruby-value">:self</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-string">"."</span>
<span class="ruby-keyword">when</span> <span class="ruby-value">:parent</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-string">".."</span>
<span class="ruby-keyword">when</span> <span class="ruby-value">:any</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-string">"*"</span>
<span class="ruby-keyword">when</span> <span class="ruby-value">:text</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-string">"text()"</span>
<span class="ruby-keyword">when</span> <span class="ruby-value">:following</span>, <span class="ruby-value">:following_sibling</span>,
<span class="ruby-value">:ancestor</span>, <span class="ruby-value">:ancestor_or_self</span>, <span class="ruby-value">:descendant</span>,
<span class="ruby-value">:namespace</span>, <span class="ruby-value">:preceding</span>, <span class="ruby-value">:preceding_sibling</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-string">"/"</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">string</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">op</span>.<span class="ruby-identifier">to_s</span>.<span class="ruby-identifier">tr</span>(<span class="ruby-string">"_"</span>, <span class="ruby-string">"-"</span>)
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-string">"::"</span>
<span class="ruby-keyword">when</span> <span class="ruby-value">:qname</span>
<span class="ruby-identifier">prefix</span> = <span class="ruby-identifier">path</span>.<span class="ruby-identifier">shift</span>
<span class="ruby-identifier">name</span> = <span class="ruby-identifier">path</span>.<span class="ruby-identifier">shift</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">prefix</span><span class="ruby-string">+":"</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">prefix</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">name</span>
<span class="ruby-keyword">when</span> <span class="ruby-value">:predicate</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-string">'['</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">predicate_to_string</span>( <span class="ruby-identifier">path</span>.<span class="ruby-identifier">shift</span> ) {<span class="ruby-operator">|</span><span class="ruby-identifier">x</span><span class="ruby-operator">|</span> <span class="ruby-identifier">abbreviate</span>( <span class="ruby-identifier">x</span> ) }
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-string">']'</span>
<span class="ruby-keyword">when</span> <span class="ruby-value">:document</span>
<span class="ruby-identifier">document</span> = <span class="ruby-keyword">true</span>
<span class="ruby-keyword">when</span> <span class="ruby-value">:function</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">path</span>.<span class="ruby-identifier">shift</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-string">"( "</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">predicate_to_string</span>( <span class="ruby-identifier">path</span>.<span class="ruby-identifier">shift</span>[<span class="ruby-value">0</span>] ) {<span class="ruby-operator">|</span><span class="ruby-identifier">x</span><span class="ruby-operator">|</span> <span class="ruby-identifier">abbreviate</span>( <span class="ruby-identifier">x</span> )}
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-string">" )"</span>
<span class="ruby-keyword">when</span> <span class="ruby-value">:literal</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-node">%Q{ "#{path.shift}" }</span>
<span class="ruby-keyword">else</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-string">"/"</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">string</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-string">"UNKNOWN("</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">op</span>.<span class="ruby-identifier">inspect</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-string">")"</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">string</span> = <span class="ruby-string">"/"</span><span class="ruby-operator">+</span><span class="ruby-identifier">string</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">document</span>
<span class="ruby-keyword">return</span> <span class="ruby-identifier">string</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-expand" class="method-detail ">
<div class="method-heading">
<span class="method-name">expand</span><span
class="method-args">( path )</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<div class="method-source-code" id="expand-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/xpathparser.rb, line 93</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">expand</span>( <span class="ruby-identifier">path</span> )
<span class="ruby-identifier">path</span> = <span class="ruby-identifier">path</span>.<span class="ruby-identifier">kind_of?</span>(<span class="ruby-constant">String</span>) <span class="ruby-operator">?</span> <span class="ruby-identifier">parse</span>( <span class="ruby-identifier">path</span> ) <span class="ruby-operator">:</span> <span class="ruby-identifier">path</span>
<span class="ruby-identifier">string</span> = <span class="ruby-string">""</span>
<span class="ruby-identifier">document</span> = <span class="ruby-keyword">false</span>
<span class="ruby-keyword">while</span> <span class="ruby-identifier">path</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
<span class="ruby-identifier">op</span> = <span class="ruby-identifier">path</span>.<span class="ruby-identifier">shift</span>
<span class="ruby-keyword">case</span> <span class="ruby-identifier">op</span>
<span class="ruby-keyword">when</span> <span class="ruby-value">:node</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-string">"node()"</span>
<span class="ruby-keyword">when</span> <span class="ruby-value">:attribute</span>, <span class="ruby-value">:child</span>, <span class="ruby-value">:following</span>, <span class="ruby-value">:following_sibling</span>,
<span class="ruby-value">:ancestor</span>, <span class="ruby-value">:ancestor_or_self</span>, <span class="ruby-value">:descendant</span>, <span class="ruby-value">:descendant_or_self</span>,
<span class="ruby-value">:namespace</span>, <span class="ruby-value">:preceding</span>, <span class="ruby-value">:preceding_sibling</span>, <span class="ruby-value">:self</span>, <span class="ruby-value">:parent</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-string">"/"</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">string</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">op</span>.<span class="ruby-identifier">to_s</span>.<span class="ruby-identifier">tr</span>(<span class="ruby-string">"_"</span>, <span class="ruby-string">"-"</span>)
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-string">"::"</span>
<span class="ruby-keyword">when</span> <span class="ruby-value">:any</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-string">"*"</span>
<span class="ruby-keyword">when</span> <span class="ruby-value">:qname</span>
<span class="ruby-identifier">prefix</span> = <span class="ruby-identifier">path</span>.<span class="ruby-identifier">shift</span>
<span class="ruby-identifier">name</span> = <span class="ruby-identifier">path</span>.<span class="ruby-identifier">shift</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">prefix</span><span class="ruby-string">+":"</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">prefix</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">name</span>
<span class="ruby-keyword">when</span> <span class="ruby-value">:predicate</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-string">'['</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">predicate_to_string</span>( <span class="ruby-identifier">path</span>.<span class="ruby-identifier">shift</span> ) { <span class="ruby-operator">|</span><span class="ruby-identifier">x</span><span class="ruby-operator">|</span> <span class="ruby-identifier">expand</span>(<span class="ruby-identifier">x</span>) }
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-string">']'</span>
<span class="ruby-keyword">when</span> <span class="ruby-value">:document</span>
<span class="ruby-identifier">document</span> = <span class="ruby-keyword">true</span>
<span class="ruby-keyword">else</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-string">"/"</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">string</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-string">"UNKNOWN("</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">op</span>.<span class="ruby-identifier">inspect</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-string">")"</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">string</span> = <span class="ruby-string">"/"</span><span class="ruby-operator">+</span><span class="ruby-identifier">string</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">document</span>
<span class="ruby-keyword">return</span> <span class="ruby-identifier">string</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-namespaces-3D" class="method-detail ">
<div class="method-heading">
<span class="method-name">namespaces=</span><span
class="method-args">( namespaces )</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<div class="method-source-code" id="namespaces-3D-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/xpathparser.rb, line 15</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">namespaces=</span>( <span class="ruby-identifier">namespaces</span> )
<span class="ruby-constant">Functions</span><span class="ruby-operator">::</span><span class="ruby-identifier">namespace_context</span> = <span class="ruby-identifier">namespaces</span>
<span class="ruby-ivar">@namespaces</span> = <span class="ruby-identifier">namespaces</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-parse" class="method-detail ">
<div class="method-heading">
<span class="method-name">parse</span><span
class="method-args">(path)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<div class="method-source-code" id="parse-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/xpathparser.rb, line 20</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">parse</span> <span class="ruby-identifier">path</span>
<span class="ruby-identifier">path</span> = <span class="ruby-identifier">path</span>.<span class="ruby-identifier">dup</span>
<span class="ruby-identifier">path</span>.<span class="ruby-identifier">gsub!</span>(<span class="ruby-regexp">/([\(\[])\s+/</span>, <span class="ruby-string">'\1'</span>) <span class="ruby-comment"># Strip ignorable spaces</span>
<span class="ruby-identifier">path</span>.<span class="ruby-identifier">gsub!</span>( <span class="ruby-regexp">/\s+([\]\)])/</span>, <span class="ruby-string">'\1'</span>)
<span class="ruby-identifier">parsed</span> = []
<span class="ruby-constant">OrExpr</span>(<span class="ruby-identifier">path</span>, <span class="ruby-identifier">parsed</span>)
<span class="ruby-identifier">parsed</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-predicate" class="method-detail ">
<div class="method-heading">
<span class="method-name">predicate</span><span
class="method-args">(path)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<div class="method-source-code" id="predicate-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/xpathparser.rb, line 29</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">predicate</span> <span class="ruby-identifier">path</span>
<span class="ruby-identifier">parsed</span> = []
<span class="ruby-constant">Predicate</span>( <span class="ruby-node">"[#{path}]"</span>, <span class="ruby-identifier">parsed</span> )
<span class="ruby-identifier">parsed</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-predicate_to_string" class="method-detail ">
<div class="method-heading">
<span class="method-name">predicate_to_string</span><span
class="method-args">( path ) { |path| ... }</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<div class="method-source-code" id="predicate_to_string-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/xpathparser.rb, line 132</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">predicate_to_string</span>( <span class="ruby-identifier">path</span>, <span class="ruby-operator">&</span><span class="ruby-identifier">block</span> )
<span class="ruby-identifier">string</span> = <span class="ruby-string">""</span>
<span class="ruby-keyword">case</span> <span class="ruby-identifier">path</span>[<span class="ruby-value">0</span>]
<span class="ruby-keyword">when</span> <span class="ruby-value">:and</span>, <span class="ruby-value">:or</span>, <span class="ruby-value">:mult</span>, <span class="ruby-value">:plus</span>, <span class="ruby-value">:minus</span>, <span class="ruby-value">:neq</span>, <span class="ruby-value">:eq</span>, <span class="ruby-value">:lt</span>, <span class="ruby-value">:gt</span>, <span class="ruby-value">:lteq</span>, <span class="ruby-value">:gteq</span>, <span class="ruby-value">:div</span>, <span class="ruby-value">:mod</span>, <span class="ruby-value">:union</span>
<span class="ruby-identifier">op</span> = <span class="ruby-identifier">path</span>.<span class="ruby-identifier">shift</span>
<span class="ruby-keyword">case</span> <span class="ruby-identifier">op</span>
<span class="ruby-keyword">when</span> <span class="ruby-value">:eq</span>
<span class="ruby-identifier">op</span> = <span class="ruby-string">"="</span>
<span class="ruby-keyword">when</span> <span class="ruby-value">:lt</span>
<span class="ruby-identifier">op</span> = <span class="ruby-string">"<"</span>
<span class="ruby-keyword">when</span> <span class="ruby-value">:gt</span>
<span class="ruby-identifier">op</span> = <span class="ruby-string">">"</span>
<span class="ruby-keyword">when</span> <span class="ruby-value">:lteq</span>
<span class="ruby-identifier">op</span> = <span class="ruby-string">"<="</span>
<span class="ruby-keyword">when</span> <span class="ruby-value">:gteq</span>
<span class="ruby-identifier">op</span> = <span class="ruby-string">">="</span>
<span class="ruby-keyword">when</span> <span class="ruby-value">:neq</span>
<span class="ruby-identifier">op</span> = <span class="ruby-string">"!="</span>
<span class="ruby-keyword">when</span> <span class="ruby-value">:union</span>
<span class="ruby-identifier">op</span> = <span class="ruby-string">"|"</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">left</span> = <span class="ruby-identifier">predicate_to_string</span>( <span class="ruby-identifier">path</span>.<span class="ruby-identifier">shift</span>, <span class="ruby-operator">&</span><span class="ruby-identifier">block</span> )
<span class="ruby-identifier">right</span> = <span class="ruby-identifier">predicate_to_string</span>( <span class="ruby-identifier">path</span>.<span class="ruby-identifier">shift</span>, <span class="ruby-operator">&</span><span class="ruby-identifier">block</span> )
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-string">" "</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">left</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-string">" "</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">op</span>.<span class="ruby-identifier">to_s</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-string">" "</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">right</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-string">" "</span>
<span class="ruby-keyword">when</span> <span class="ruby-value">:function</span>
<span class="ruby-identifier">path</span>.<span class="ruby-identifier">shift</span>
<span class="ruby-identifier">name</span> = <span class="ruby-identifier">path</span>.<span class="ruby-identifier">shift</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">name</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-string">"( "</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">predicate_to_string</span>( <span class="ruby-identifier">path</span>.<span class="ruby-identifier">shift</span>, <span class="ruby-operator">&</span><span class="ruby-identifier">block</span> )
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-string">" )"</span>
<span class="ruby-keyword">when</span> <span class="ruby-value">:literal</span>
<span class="ruby-identifier">path</span>.<span class="ruby-identifier">shift</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-string">" "</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">path</span>.<span class="ruby-identifier">shift</span>.<span class="ruby-identifier">inspect</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-string">" "</span>
<span class="ruby-keyword">else</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-string">" "</span>
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-keyword">yield</span>( <span class="ruby-identifier">path</span> )
<span class="ruby-identifier">string</span> <span class="ruby-operator"><<</span> <span class="ruby-string">" "</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">return</span> <span class="ruby-identifier">string</span>.<span class="ruby-identifier">squeeze</span>(<span class="ruby-string">" "</span>)
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
</section>
<section id="private-instance-5Buntitled-5D-method-details" class="method-section">
<header>
<h3>Private Instance Methods</h3>
</header>
<div id="method-i-AdditiveExpr" class="method-detail ">
<div class="method-heading">
<span class="method-name">AdditiveExpr</span><span
class="method-args">(path, parsed)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>| <a href="XPathParser.html#method-i-AdditiveExpr"><code>AdditiveExpr</code></a> ('+' | '-') <a href="XPathParser.html#method-i-MultiplicativeExpr"><code>MultiplicativeExpr</code></a> | <a href="XPathParser.html#method-i-MultiplicativeExpr"><code>MultiplicativeExpr</code></a></p>
<div class="method-source-code" id="AdditiveExpr-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/xpathparser.rb, line 443</span>
<span class="ruby-keyword">def</span> <span class="ruby-constant">AdditiveExpr</span> <span class="ruby-identifier ruby-title">path</span>, <span class="ruby-identifier">parsed</span>
<span class="ruby-identifier">n</span> = []
<span class="ruby-identifier">rest</span> = <span class="ruby-constant">MultiplicativeExpr</span>( <span class="ruby-identifier">path</span>, <span class="ruby-identifier">n</span> )
<span class="ruby-keyword">if</span> <span class="ruby-identifier">rest</span> <span class="ruby-operator">!=</span> <span class="ruby-identifier">path</span>
<span class="ruby-keyword">while</span> <span class="ruby-identifier">rest</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp">/^\s*(\+|-)\s*/</span>
<span class="ruby-keyword">if</span> <span class="ruby-node">$1</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-value">?+</span>
<span class="ruby-identifier">n</span> = [ <span class="ruby-value">:plus</span>, <span class="ruby-identifier">n</span>, [] ]
<span class="ruby-keyword">else</span>
<span class="ruby-identifier">n</span> = [ <span class="ruby-value">:minus</span>, <span class="ruby-identifier">n</span>, [] ]
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">rest</span> = <span class="ruby-constant">MultiplicativeExpr</span>( <span class="ruby-node">$'</span>, <span class="ruby-identifier">n</span>[<span class="ruby-value">-1</span>] )
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">parsed</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span> <span class="ruby-keyword">and</span> <span class="ruby-identifier">n</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">!=</span> <span class="ruby-value">0</span>
<span class="ruby-identifier">parsed</span>.<span class="ruby-identifier">replace</span>(<span class="ruby-identifier">n</span>)
<span class="ruby-keyword">elsif</span> <span class="ruby-identifier">n</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">n</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">rest</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-AndExpr" class="method-detail ">
<div class="method-heading">
<span class="method-name">AndExpr</span><span
class="method-args">(path, parsed)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>| <a href="XPathParser.html#method-i-AndExpr"><code>AndExpr</code></a> S 'and' S <a href="XPathParser.html#method-i-EqualityExpr"><code>EqualityExpr</code></a> | <a href="XPathParser.html#method-i-EqualityExpr"><code>EqualityExpr</code></a></p>
<div class="method-source-code" id="AndExpr-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/xpathparser.rb, line 376</span>
<span class="ruby-keyword">def</span> <span class="ruby-constant">AndExpr</span> <span class="ruby-identifier ruby-title">path</span>, <span class="ruby-identifier">parsed</span>
<span class="ruby-identifier">n</span> = []
<span class="ruby-identifier">rest</span> = <span class="ruby-constant">EqualityExpr</span>( <span class="ruby-identifier">path</span>, <span class="ruby-identifier">n</span> )
<span class="ruby-keyword">if</span> <span class="ruby-identifier">rest</span> <span class="ruby-operator">!=</span> <span class="ruby-identifier">path</span>
<span class="ruby-keyword">while</span> <span class="ruby-identifier">rest</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp">/^\s*( and )/</span>
<span class="ruby-identifier">n</span> = [ <span class="ruby-value">:and</span>, <span class="ruby-identifier">n</span>, [] ]
<span class="ruby-identifier">rest</span> = <span class="ruby-constant">EqualityExpr</span>( <span class="ruby-node">$'</span>, <span class="ruby-identifier">n</span>[<span class="ruby-value">-1</span>] )
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">parsed</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span> <span class="ruby-keyword">and</span> <span class="ruby-identifier">n</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">!=</span> <span class="ruby-value">0</span>
<span class="ruby-identifier">parsed</span>.<span class="ruby-identifier">replace</span>(<span class="ruby-identifier">n</span>)
<span class="ruby-keyword">elsif</span> <span class="ruby-identifier">n</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">n</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">rest</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-EqualityExpr" class="method-detail ">
<div class="method-heading">
<span class="method-name">EqualityExpr</span><span
class="method-args">(path, parsed)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>| <a href="XPathParser.html#method-i-EqualityExpr"><code>EqualityExpr</code></a> ('=' | '!=') <a href="XPathParser.html#method-i-RelationalExpr"><code>RelationalExpr</code></a> | <a href="XPathParser.html#method-i-RelationalExpr"><code>RelationalExpr</code></a></p>
<div class="method-source-code" id="EqualityExpr-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/xpathparser.rb, line 395</span>
<span class="ruby-keyword">def</span> <span class="ruby-constant">EqualityExpr</span> <span class="ruby-identifier ruby-title">path</span>, <span class="ruby-identifier">parsed</span>
<span class="ruby-identifier">n</span> = []
<span class="ruby-identifier">rest</span> = <span class="ruby-constant">RelationalExpr</span>( <span class="ruby-identifier">path</span>, <span class="ruby-identifier">n</span> )
<span class="ruby-keyword">if</span> <span class="ruby-identifier">rest</span> <span class="ruby-operator">!=</span> <span class="ruby-identifier">path</span>
<span class="ruby-keyword">while</span> <span class="ruby-identifier">rest</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp">/^\s*(!?=)\s*/</span>
<span class="ruby-keyword">if</span> <span class="ruby-node">$1</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-value">?!</span>
<span class="ruby-identifier">n</span> = [ <span class="ruby-value">:neq</span>, <span class="ruby-identifier">n</span>, [] ]
<span class="ruby-keyword">else</span>
<span class="ruby-identifier">n</span> = [ <span class="ruby-value">:eq</span>, <span class="ruby-identifier">n</span>, [] ]
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">rest</span> = <span class="ruby-constant">RelationalExpr</span>( <span class="ruby-node">$'</span>, <span class="ruby-identifier">n</span>[<span class="ruby-value">-1</span>] )
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">parsed</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span> <span class="ruby-keyword">and</span> <span class="ruby-identifier">n</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">!=</span> <span class="ruby-value">0</span>
<span class="ruby-identifier">parsed</span>.<span class="ruby-identifier">replace</span>(<span class="ruby-identifier">n</span>)
<span class="ruby-keyword">elsif</span> <span class="ruby-identifier">n</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">n</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">rest</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-FilterExpr" class="method-detail ">
<div class="method-heading">
<span class="method-name">FilterExpr</span><span
class="method-args">(path, parsed)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>| <a href="XPathParser.html#method-i-FilterExpr"><code>FilterExpr</code></a> <a href="XPathParser.html#method-i-Predicate"><code>Predicate</code></a> | <a href="XPathParser.html#method-i-PrimaryExpr"><code>PrimaryExpr</code></a></p>
<div class="method-source-code" id="FilterExpr-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/xpathparser.rb, line 546</span>
<span class="ruby-keyword">def</span> <span class="ruby-constant">FilterExpr</span> <span class="ruby-identifier ruby-title">path</span>, <span class="ruby-identifier">parsed</span>
<span class="ruby-identifier">n</span> = []
<span class="ruby-identifier">path</span> = <span class="ruby-constant">PrimaryExpr</span>( <span class="ruby-identifier">path</span>, <span class="ruby-identifier">n</span> )
<span class="ruby-identifier">path</span> = <span class="ruby-constant">Predicate</span>(<span class="ruby-identifier">path</span>, <span class="ruby-identifier">n</span>)
<span class="ruby-identifier">parsed</span>.<span class="ruby-identifier">concat</span>(<span class="ruby-identifier">n</span>)
<span class="ruby-identifier">path</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-FunctionCall" class="method-detail ">
<div class="method-heading">
<span class="method-name">FunctionCall</span><span
class="method-args">(rest, parsed)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>| FUNCTION_NAME '(' ( expr ( ',' expr )* )? ')'</p>
<div class="method-source-code" id="FunctionCall-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/xpathparser.rb, line 599</span>
<span class="ruby-keyword">def</span> <span class="ruby-constant">FunctionCall</span> <span class="ruby-identifier ruby-title">rest</span>, <span class="ruby-identifier">parsed</span>
<span class="ruby-identifier">path</span>, <span class="ruby-identifier">arguments</span> = <span class="ruby-identifier">parse_args</span>(<span class="ruby-identifier">rest</span>)
<span class="ruby-identifier">argset</span> = []
<span class="ruby-keyword">for</span> <span class="ruby-identifier">argument</span> <span class="ruby-keyword">in</span> <span class="ruby-identifier">arguments</span>
<span class="ruby-identifier">args</span> = []
<span class="ruby-constant">OrExpr</span>( <span class="ruby-identifier">argument</span>, <span class="ruby-identifier">args</span> )
<span class="ruby-identifier">argset</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">args</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">argset</span>
<span class="ruby-identifier">path</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-LocationPath" class="method-detail ">
<div class="method-heading">
<span class="method-name">LocationPath</span><span
class="method-args">(path, parsed)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p><a href="XPathParser.html#method-i-LocationPath"><code>LocationPath</code></a></p>
<pre>| RelativeLocationPath
| '/' RelativeLocationPath?
| '//' RelativeLocationPath</pre>
<div class="method-source-code" id="LocationPath-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/xpathparser.rb, line 187</span>
<span class="ruby-keyword">def</span> <span class="ruby-constant">LocationPath</span> <span class="ruby-identifier ruby-title">path</span>, <span class="ruby-identifier">parsed</span>
<span class="ruby-identifier">path</span> = <span class="ruby-identifier">path</span>.<span class="ruby-identifier">lstrip</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">path</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-value">?/</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-value">:document</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">path</span>[<span class="ruby-value">1</span>] <span class="ruby-operator">==</span> <span class="ruby-value">?/</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-value">:descendant_or_self</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-value">:node</span>
<span class="ruby-identifier">path</span> = <span class="ruby-identifier">path</span>[<span class="ruby-value">2</span><span class="ruby-operator">..</span><span class="ruby-value">-1</span>]
<span class="ruby-keyword">else</span>
<span class="ruby-identifier">path</span> = <span class="ruby-identifier">path</span>[<span class="ruby-value">1</span><span class="ruby-operator">..</span><span class="ruby-value">-1</span>]
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">return</span> <span class="ruby-constant">RelativeLocationPath</span>( <span class="ruby-identifier">path</span>, <span class="ruby-identifier">parsed</span> ) <span class="ruby-keyword">if</span> <span class="ruby-identifier">path</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-MultiplicativeExpr" class="method-detail ">
<div class="method-heading">
<span class="method-name">MultiplicativeExpr</span><span
class="method-args">(path, parsed)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>| <a href="XPathParser.html#method-i-MultiplicativeExpr"><code>MultiplicativeExpr</code></a> ('*' | S ('div' | 'mod') S) <a href="XPathParser.html#method-i-UnaryExpr"><code>UnaryExpr</code></a> | <a href="XPathParser.html#method-i-UnaryExpr"><code>UnaryExpr</code></a></p>
<div class="method-source-code" id="MultiplicativeExpr-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/xpathparser.rb, line 466</span>
<span class="ruby-keyword">def</span> <span class="ruby-constant">MultiplicativeExpr</span> <span class="ruby-identifier ruby-title">path</span>, <span class="ruby-identifier">parsed</span>
<span class="ruby-identifier">n</span> = []
<span class="ruby-identifier">rest</span> = <span class="ruby-constant">UnaryExpr</span>( <span class="ruby-identifier">path</span>, <span class="ruby-identifier">n</span> )
<span class="ruby-keyword">if</span> <span class="ruby-identifier">rest</span> <span class="ruby-operator">!=</span> <span class="ruby-identifier">path</span>
<span class="ruby-keyword">while</span> <span class="ruby-identifier">rest</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp">/^\s*(\*| div | mod )\s*/</span>
<span class="ruby-keyword">if</span> <span class="ruby-node">$1</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-value">?*</span>
<span class="ruby-identifier">n</span> = [ <span class="ruby-value">:mult</span>, <span class="ruby-identifier">n</span>, [] ]
<span class="ruby-keyword">elsif</span> <span class="ruby-node">$1</span>.<span class="ruby-identifier">include?</span>( <span class="ruby-string">"div"</span> )
<span class="ruby-identifier">n</span> = [ <span class="ruby-value">:div</span>, <span class="ruby-identifier">n</span>, [] ]
<span class="ruby-keyword">else</span>
<span class="ruby-identifier">n</span> = [ <span class="ruby-value">:mod</span>, <span class="ruby-identifier">n</span>, [] ]
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">rest</span> = <span class="ruby-constant">UnaryExpr</span>( <span class="ruby-node">$'</span>, <span class="ruby-identifier">n</span>[<span class="ruby-value">-1</span>] )
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">parsed</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span> <span class="ruby-keyword">and</span> <span class="ruby-identifier">n</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">!=</span> <span class="ruby-value">0</span>
<span class="ruby-identifier">parsed</span>.<span class="ruby-identifier">replace</span>(<span class="ruby-identifier">n</span>)
<span class="ruby-keyword">elsif</span> <span class="ruby-identifier">n</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">n</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">rest</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-NodeTest" class="method-detail ">
<div class="method-heading">
<span class="method-name">NodeTest</span><span
class="method-args">(path, parsed)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<div class="method-source-code" id="NodeTest-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/xpathparser.rb, line 283</span>
<span class="ruby-keyword">def</span> <span class="ruby-constant">NodeTest</span> <span class="ruby-identifier ruby-title">path</span>, <span class="ruby-identifier">parsed</span>
<span class="ruby-identifier">original_path</span> = <span class="ruby-identifier">path</span>
<span class="ruby-identifier">path</span> = <span class="ruby-identifier">path</span>.<span class="ruby-identifier">lstrip</span>
<span class="ruby-keyword">case</span> <span class="ruby-identifier">path</span>
<span class="ruby-keyword">when</span> <span class="ruby-constant">PREFIX_WILDCARD</span>
<span class="ruby-identifier">prefix</span> = <span class="ruby-keyword">nil</span>
<span class="ruby-identifier">name</span> = <span class="ruby-node">$1</span>
<span class="ruby-identifier">path</span> = <span class="ruby-node">$'</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-value">:qname</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">prefix</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">name</span>
<span class="ruby-keyword">when</span> <span class="ruby-regexp">/^\*/</span>
<span class="ruby-identifier">path</span> = <span class="ruby-node">$'</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-value">:any</span>
<span class="ruby-keyword">when</span> <span class="ruby-constant">NODE_TYPE</span>
<span class="ruby-identifier">type</span> = <span class="ruby-node">$1</span>
<span class="ruby-identifier">path</span> = <span class="ruby-node">$'</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">type</span>.<span class="ruby-identifier">tr</span>(<span class="ruby-string">'-'</span>, <span class="ruby-string">'_'</span>).<span class="ruby-identifier">intern</span>
<span class="ruby-keyword">when</span> <span class="ruby-constant">PI</span>
<span class="ruby-identifier">path</span> = <span class="ruby-node">$'</span>
<span class="ruby-identifier">literal</span> = <span class="ruby-keyword">nil</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">path</span> <span class="ruby-operator">!~</span> <span class="ruby-regexp">/^\s*\)/</span>
<span class="ruby-identifier">path</span> <span class="ruby-operator">=~</span> <span class="ruby-constant">LITERAL</span>
<span class="ruby-identifier">literal</span> = <span class="ruby-node">$1</span>
<span class="ruby-identifier">path</span> = <span class="ruby-node">$'</span>
<span class="ruby-identifier">raise</span> <span class="ruby-constant">ParseException</span>.<span class="ruby-identifier">new</span>(<span class="ruby-string">"Missing ')' after processing instruction"</span>) <span class="ruby-keyword">if</span> <span class="ruby-identifier">path</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">!=</span> <span class="ruby-value">?)</span>
<span class="ruby-identifier">path</span> = <span class="ruby-identifier">path</span>[<span class="ruby-value">1</span><span class="ruby-operator">..</span><span class="ruby-value">-1</span>]
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-value">:processing_instruction</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> (<span class="ruby-identifier">literal</span> <span class="ruby-operator">||</span> <span class="ruby-string">''</span>)
<span class="ruby-keyword">when</span> <span class="ruby-constant">LOCAL_NAME_WILDCARD</span>
<span class="ruby-identifier">prefix</span> = <span class="ruby-node">$1</span>
<span class="ruby-identifier">path</span> = <span class="ruby-node">$'</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-value">:namespace</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">prefix</span>
<span class="ruby-keyword">when</span> <span class="ruby-constant">QNAME</span>
<span class="ruby-identifier">prefix</span> = <span class="ruby-node">$1</span>
<span class="ruby-identifier">name</span> = <span class="ruby-node">$2</span>
<span class="ruby-identifier">path</span> = <span class="ruby-node">$'</span>
<span class="ruby-identifier">prefix</span> = <span class="ruby-string">""</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">prefix</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-value">:qname</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">prefix</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">name</span>
<span class="ruby-keyword">else</span>
<span class="ruby-identifier">path</span> = <span class="ruby-identifier">original_path</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">return</span> <span class="ruby-identifier">path</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-OrExpr" class="method-detail ">
<div class="method-heading">
<span class="method-name">OrExpr</span><span
class="method-args">(path, parsed)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>| <a href="XPathParser.html#method-i-OrExpr"><code>OrExpr</code></a> S 'or' S <a href="XPathParser.html#method-i-AndExpr"><code>AndExpr</code></a> | <a href="XPathParser.html#method-i-AndExpr"><code>AndExpr</code></a></p>
<div class="method-source-code" id="OrExpr-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/xpathparser.rb, line 357</span>
<span class="ruby-keyword">def</span> <span class="ruby-constant">OrExpr</span> <span class="ruby-identifier ruby-title">path</span>, <span class="ruby-identifier">parsed</span>
<span class="ruby-identifier">n</span> = []
<span class="ruby-identifier">rest</span> = <span class="ruby-constant">AndExpr</span>( <span class="ruby-identifier">path</span>, <span class="ruby-identifier">n</span> )
<span class="ruby-keyword">if</span> <span class="ruby-identifier">rest</span> <span class="ruby-operator">!=</span> <span class="ruby-identifier">path</span>
<span class="ruby-keyword">while</span> <span class="ruby-identifier">rest</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp">/^\s*( or )/</span>
<span class="ruby-identifier">n</span> = [ <span class="ruby-value">:or</span>, <span class="ruby-identifier">n</span>, [] ]
<span class="ruby-identifier">rest</span> = <span class="ruby-constant">AndExpr</span>( <span class="ruby-node">$'</span>, <span class="ruby-identifier">n</span>[<span class="ruby-value">-1</span>] )
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">parsed</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span> <span class="ruby-keyword">and</span> <span class="ruby-identifier">n</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">!=</span> <span class="ruby-value">0</span>
<span class="ruby-identifier">parsed</span>.<span class="ruby-identifier">replace</span>(<span class="ruby-identifier">n</span>)
<span class="ruby-keyword">elsif</span> <span class="ruby-identifier">n</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">n</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">rest</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-PathExpr" class="method-detail ">
<div class="method-heading">
<span class="method-name">PathExpr</span><span
class="method-args">(path, parsed)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>| <a href="XPathParser.html#method-i-LocationPath"><code>LocationPath</code></a> | <a href="XPathParser.html#method-i-FilterExpr"><code>FilterExpr</code></a> ('/' | '//') <a href="XPathParser.html#method-i-RelativeLocationPath"><code>RelativeLocationPath</code></a></p>
<div class="method-source-code" id="PathExpr-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/xpathparser.rb, line 528</span>
<span class="ruby-keyword">def</span> <span class="ruby-constant">PathExpr</span> <span class="ruby-identifier ruby-title">path</span>, <span class="ruby-identifier">parsed</span>
<span class="ruby-identifier">path</span> = <span class="ruby-identifier">path</span>.<span class="ruby-identifier">lstrip</span>
<span class="ruby-identifier">n</span> = []
<span class="ruby-identifier">rest</span> = <span class="ruby-constant">FilterExpr</span>( <span class="ruby-identifier">path</span>, <span class="ruby-identifier">n</span> )
<span class="ruby-keyword">if</span> <span class="ruby-identifier">rest</span> <span class="ruby-operator">!=</span> <span class="ruby-identifier">path</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">rest</span> <span class="ruby-keyword">and</span> <span class="ruby-identifier">rest</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-value">?/</span>
<span class="ruby-identifier">rest</span> = <span class="ruby-constant">RelativeLocationPath</span>(<span class="ruby-identifier">rest</span>, <span class="ruby-identifier">n</span>)
<span class="ruby-identifier">parsed</span>.<span class="ruby-identifier">concat</span>(<span class="ruby-identifier">n</span>)
<span class="ruby-keyword">return</span> <span class="ruby-identifier">rest</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">rest</span> = <span class="ruby-constant">LocationPath</span>(<span class="ruby-identifier">rest</span>, <span class="ruby-identifier">n</span>) <span class="ruby-keyword">if</span> <span class="ruby-identifier">rest</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp">/\A[\/\.\@\[\w*]/</span>
<span class="ruby-identifier">parsed</span>.<span class="ruby-identifier">concat</span>(<span class="ruby-identifier">n</span>)
<span class="ruby-keyword">return</span> <span class="ruby-identifier">rest</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-Predicate" class="method-detail ">
<div class="method-heading">
<span class="method-name">Predicate</span><span
class="method-args">(path, parsed)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>Filters the supplied nodeset on the predicate(s)</p>
<div class="method-source-code" id="Predicate-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/xpathparser.rb, line 333</span>
<span class="ruby-keyword">def</span> <span class="ruby-constant">Predicate</span> <span class="ruby-identifier ruby-title">path</span>, <span class="ruby-identifier">parsed</span>
<span class="ruby-identifier">original_path</span> = <span class="ruby-identifier">path</span>
<span class="ruby-identifier">path</span> = <span class="ruby-identifier">path</span>.<span class="ruby-identifier">lstrip</span>
<span class="ruby-keyword">return</span> <span class="ruby-identifier">original_path</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">path</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-value">?[</span>
<span class="ruby-identifier">predicates</span> = []
<span class="ruby-keyword">while</span> <span class="ruby-identifier">path</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-value">?[</span>
<span class="ruby-identifier">path</span>, <span class="ruby-identifier">expr</span> = <span class="ruby-identifier">get_group</span>(<span class="ruby-identifier">path</span>)
<span class="ruby-identifier">predicates</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">expr</span>[<span class="ruby-value">1</span><span class="ruby-operator">..</span><span class="ruby-value">-2</span>] <span class="ruby-keyword">if</span> <span class="ruby-identifier">expr</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">predicates</span>.<span class="ruby-identifier">each</span>{ <span class="ruby-operator">|</span><span class="ruby-identifier">pred</span><span class="ruby-operator">|</span>
<span class="ruby-identifier">preds</span> = []
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-value">:predicate</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">preds</span>
<span class="ruby-constant">OrExpr</span>(<span class="ruby-identifier">pred</span>, <span class="ruby-identifier">preds</span>)
}
<span class="ruby-identifier">path</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-PrimaryExpr" class="method-detail ">
<div class="method-heading">
<span class="method-name">PrimaryExpr</span><span
class="method-args">(path, parsed)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<div class="method-source-code" id="PrimaryExpr-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/xpathparser.rb, line 562</span>
<span class="ruby-keyword">def</span> <span class="ruby-constant">PrimaryExpr</span> <span class="ruby-identifier ruby-title">path</span>, <span class="ruby-identifier">parsed</span>
<span class="ruby-keyword">case</span> <span class="ruby-identifier">path</span>
<span class="ruby-keyword">when</span> <span class="ruby-constant">VARIABLE_REFERENCE</span>
<span class="ruby-identifier">varname</span> = <span class="ruby-node">$1</span>
<span class="ruby-identifier">path</span> = <span class="ruby-node">$'</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-value">:variable</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">varname</span>
<span class="ruby-comment">#arry << @variables[ varname ]</span>
<span class="ruby-keyword">when</span> <span class="ruby-regexp">/^(\w[-\w]*)(?:\()/</span>
<span class="ruby-identifier">fname</span> = <span class="ruby-node">$1</span>
<span class="ruby-identifier">tmp</span> = <span class="ruby-node">$'</span>
<span class="ruby-keyword">return</span> <span class="ruby-identifier">path</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">fname</span> <span class="ruby-operator">=~</span> <span class="ruby-constant">NT</span>
<span class="ruby-identifier">path</span> = <span class="ruby-identifier">tmp</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-value">:function</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">fname</span>
<span class="ruby-identifier">path</span> = <span class="ruby-constant">FunctionCall</span>(<span class="ruby-identifier">path</span>, <span class="ruby-identifier">parsed</span>)
<span class="ruby-keyword">when</span> <span class="ruby-constant">NUMBER</span>
<span class="ruby-identifier">varname</span> = <span class="ruby-node">$1</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">?</span> <span class="ruby-node">$2</span> <span class="ruby-operator">:</span> <span class="ruby-node">$1</span>
<span class="ruby-identifier">path</span> = <span class="ruby-node">$'</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-value">:literal</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> (<span class="ruby-identifier">varname</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-string">'.'</span>) <span class="ruby-operator">?</span> <span class="ruby-identifier">varname</span>.<span class="ruby-identifier">to_f</span> <span class="ruby-operator">:</span> <span class="ruby-identifier">varname</span>.<span class="ruby-identifier">to_i</span>)
<span class="ruby-keyword">when</span> <span class="ruby-constant">LITERAL</span>
<span class="ruby-identifier">varname</span> = <span class="ruby-node">$1</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">?</span> <span class="ruby-node">$2</span> <span class="ruby-operator">:</span> <span class="ruby-node">$1</span>
<span class="ruby-identifier">path</span> = <span class="ruby-node">$'</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-value">:literal</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">varname</span>
<span class="ruby-keyword">when</span> <span class="ruby-regexp">/^\(/</span> <span class="ruby-comment">#/</span>
<span class="ruby-identifier">path</span>, <span class="ruby-identifier">contents</span> = <span class="ruby-identifier">get_group</span>(<span class="ruby-identifier">path</span>)
<span class="ruby-identifier">contents</span> = <span class="ruby-identifier">contents</span>[<span class="ruby-value">1</span><span class="ruby-operator">..</span><span class="ruby-value">-2</span>]
<span class="ruby-identifier">n</span> = []
<span class="ruby-constant">OrExpr</span>( <span class="ruby-identifier">contents</span>, <span class="ruby-identifier">n</span> )
<span class="ruby-identifier">parsed</span>.<span class="ruby-identifier">concat</span>(<span class="ruby-identifier">n</span>)
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">path</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-RelationalExpr" class="method-detail ">
<div class="method-heading">
<span class="method-name">RelationalExpr</span><span
class="method-args">(path, parsed)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>| <a href="XPathParser.html#method-i-RelationalExpr"><code>RelationalExpr</code></a> ('<' | '>' | '<=' | '>=') <a href="XPathParser.html#method-i-AdditiveExpr"><code>AdditiveExpr</code></a> | <a href="XPathParser.html#method-i-AdditiveExpr"><code>AdditiveExpr</code></a></p>
<div class="method-source-code" id="RelationalExpr-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/xpathparser.rb, line 418</span>
<span class="ruby-keyword">def</span> <span class="ruby-constant">RelationalExpr</span> <span class="ruby-identifier ruby-title">path</span>, <span class="ruby-identifier">parsed</span>
<span class="ruby-identifier">n</span> = []
<span class="ruby-identifier">rest</span> = <span class="ruby-constant">AdditiveExpr</span>( <span class="ruby-identifier">path</span>, <span class="ruby-identifier">n</span> )
<span class="ruby-keyword">if</span> <span class="ruby-identifier">rest</span> <span class="ruby-operator">!=</span> <span class="ruby-identifier">path</span>
<span class="ruby-keyword">while</span> <span class="ruby-identifier">rest</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp">/^\s*([<>]=?)\s*/</span>
<span class="ruby-keyword">if</span> <span class="ruby-node">$1</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-value">?<</span>
<span class="ruby-identifier">sym</span> = <span class="ruby-string">"lt"</span>
<span class="ruby-keyword">else</span>
<span class="ruby-identifier">sym</span> = <span class="ruby-string">"gt"</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">sym</span> <span class="ruby-operator"><<</span> <span class="ruby-string">"eq"</span> <span class="ruby-keyword">if</span> <span class="ruby-node">$1</span>[<span class="ruby-value">-1</span>] <span class="ruby-operator">==</span> <span class="ruby-value">?=</span>
<span class="ruby-identifier">n</span> = [ <span class="ruby-identifier">sym</span>.<span class="ruby-identifier">intern</span>, <span class="ruby-identifier">n</span>, [] ]
<span class="ruby-identifier">rest</span> = <span class="ruby-constant">AdditiveExpr</span>( <span class="ruby-node">$'</span>, <span class="ruby-identifier">n</span>[<span class="ruby-value">-1</span>] )
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">parsed</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span> <span class="ruby-keyword">and</span> <span class="ruby-identifier">n</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">!=</span> <span class="ruby-value">0</span>
<span class="ruby-identifier">parsed</span>.<span class="ruby-identifier">replace</span>(<span class="ruby-identifier">n</span>)
<span class="ruby-keyword">elsif</span> <span class="ruby-identifier">n</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">n</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">rest</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-RelativeLocationPath" class="method-detail ">
<div class="method-heading">
<span class="method-name">RelativeLocationPath</span><span
class="method-args">(path, parsed)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<div class="method-source-code" id="RelativeLocationPath-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/xpathparser.rb, line 211</span>
<span class="ruby-keyword">def</span> <span class="ruby-constant">RelativeLocationPath</span> <span class="ruby-identifier ruby-title">path</span>, <span class="ruby-identifier">parsed</span>
<span class="ruby-identifier">loop</span> <span class="ruby-keyword">do</span>
<span class="ruby-identifier">original_path</span> = <span class="ruby-identifier">path</span>
<span class="ruby-identifier">path</span> = <span class="ruby-identifier">path</span>.<span class="ruby-identifier">lstrip</span>
<span class="ruby-keyword">return</span> <span class="ruby-identifier">original_path</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">path</span>.<span class="ruby-identifier">empty?</span>
<span class="ruby-comment"># (axis or @ or <child::>) nodetest predicate ></span>
<span class="ruby-comment"># OR > / Step</span>
<span class="ruby-comment"># (. or ..) ></span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">path</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-value">?.</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">path</span>[<span class="ruby-value">1</span>] <span class="ruby-operator">==</span> <span class="ruby-value">?.</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-value">:parent</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-value">:node</span>
<span class="ruby-identifier">path</span> = <span class="ruby-identifier">path</span>[<span class="ruby-value">2</span><span class="ruby-operator">..</span><span class="ruby-value">-1</span>]
<span class="ruby-keyword">else</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-value">:self</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-value">:node</span>
<span class="ruby-identifier">path</span> = <span class="ruby-identifier">path</span>[<span class="ruby-value">1</span><span class="ruby-operator">..</span><span class="ruby-value">-1</span>]
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">else</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">path</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-value">?@</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-value">:attribute</span>
<span class="ruby-identifier">path</span> = <span class="ruby-identifier">path</span>[<span class="ruby-value">1</span><span class="ruby-operator">..</span><span class="ruby-value">-1</span>]
<span class="ruby-comment"># Goto Nodetest</span>
<span class="ruby-keyword">elsif</span> <span class="ruby-identifier">path</span> <span class="ruby-operator">=~</span> <span class="ruby-constant">AXIS</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-node">$1</span>.<span class="ruby-identifier">tr</span>(<span class="ruby-string">'-'</span>,<span class="ruby-string">'_'</span>).<span class="ruby-identifier">intern</span>
<span class="ruby-identifier">path</span> = <span class="ruby-node">$'</span>
<span class="ruby-comment"># Goto Nodetest</span>
<span class="ruby-keyword">else</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-value">:child</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">n</span> = []
<span class="ruby-identifier">path</span> = <span class="ruby-constant">NodeTest</span>( <span class="ruby-identifier">path</span>, <span class="ruby-identifier">n</span>)
<span class="ruby-identifier">path</span> = <span class="ruby-constant">Predicate</span>( <span class="ruby-identifier">path</span>, <span class="ruby-identifier">n</span> )
<span class="ruby-identifier">parsed</span>.<span class="ruby-identifier">concat</span>(<span class="ruby-identifier">n</span>)
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">original_path</span> = <span class="ruby-identifier">path</span>
<span class="ruby-identifier">path</span> = <span class="ruby-identifier">path</span>.<span class="ruby-identifier">lstrip</span>
<span class="ruby-keyword">return</span> <span class="ruby-identifier">original_path</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">path</span>.<span class="ruby-identifier">empty?</span>
<span class="ruby-keyword">return</span> <span class="ruby-identifier">original_path</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">path</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">!=</span> <span class="ruby-value">?/</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">path</span>[<span class="ruby-value">1</span>] <span class="ruby-operator">==</span> <span class="ruby-value">?/</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-value">:descendant_or_self</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-value">:node</span>
<span class="ruby-identifier">path</span> = <span class="ruby-identifier">path</span>[<span class="ruby-value">2</span><span class="ruby-operator">..</span><span class="ruby-value">-1</span>]
<span class="ruby-keyword">else</span>
<span class="ruby-identifier">path</span> = <span class="ruby-identifier">path</span>[<span class="ruby-value">1</span><span class="ruby-operator">..</span><span class="ruby-value">-1</span>]
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-UnaryExpr" class="method-detail ">
<div class="method-heading">
<span class="method-name">UnaryExpr</span><span
class="method-args">(path, parsed)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>| '-' <a href="XPathParser.html#method-i-UnaryExpr"><code>UnaryExpr</code></a> | <a href="XPathParser.html#method-i-UnionExpr"><code>UnionExpr</code></a></p>
<div class="method-source-code" id="UnaryExpr-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/xpathparser.rb, line 491</span>
<span class="ruby-keyword">def</span> <span class="ruby-constant">UnaryExpr</span> <span class="ruby-identifier ruby-title">path</span>, <span class="ruby-identifier">parsed</span>
<span class="ruby-identifier">path</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp">/^(\-*)/</span>
<span class="ruby-identifier">path</span> = <span class="ruby-node">$'</span>
<span class="ruby-keyword">if</span> <span class="ruby-node">$1</span> <span class="ruby-keyword">and</span> ((<span class="ruby-node">$1</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">%</span> <span class="ruby-value">2</span>) <span class="ruby-operator">!=</span> <span class="ruby-value">0</span>)
<span class="ruby-identifier">mult</span> = <span class="ruby-value">-1</span>
<span class="ruby-keyword">else</span>
<span class="ruby-identifier">mult</span> = <span class="ruby-value">1</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-value">:neg</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">mult</span> <span class="ruby-operator"><</span> <span class="ruby-value">0</span>
<span class="ruby-identifier">n</span> = []
<span class="ruby-identifier">path</span> = <span class="ruby-constant">UnionExpr</span>( <span class="ruby-identifier">path</span>, <span class="ruby-identifier">n</span> )
<span class="ruby-identifier">parsed</span>.<span class="ruby-identifier">concat</span>( <span class="ruby-identifier">n</span> )
<span class="ruby-identifier">path</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-UnionExpr" class="method-detail ">
<div class="method-heading">
<span class="method-name">UnionExpr</span><span
class="method-args">(path, parsed)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>| <a href="XPathParser.html#method-i-UnionExpr"><code>UnionExpr</code></a> '|' <a href="XPathParser.html#method-i-PathExpr"><code>PathExpr</code></a> | <a href="XPathParser.html#method-i-PathExpr"><code>PathExpr</code></a></p>
<div class="method-source-code" id="UnionExpr-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/xpathparser.rb, line 509</span>
<span class="ruby-keyword">def</span> <span class="ruby-constant">UnionExpr</span> <span class="ruby-identifier ruby-title">path</span>, <span class="ruby-identifier">parsed</span>
<span class="ruby-identifier">n</span> = []
<span class="ruby-identifier">rest</span> = <span class="ruby-constant">PathExpr</span>( <span class="ruby-identifier">path</span>, <span class="ruby-identifier">n</span> )
<span class="ruby-keyword">if</span> <span class="ruby-identifier">rest</span> <span class="ruby-operator">!=</span> <span class="ruby-identifier">path</span>
<span class="ruby-keyword">while</span> <span class="ruby-identifier">rest</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp">/^\s*(\|)\s*/</span>
<span class="ruby-identifier">n</span> = [ <span class="ruby-value">:union</span>, <span class="ruby-identifier">n</span>, [] ]
<span class="ruby-identifier">rest</span> = <span class="ruby-constant">PathExpr</span>( <span class="ruby-node">$'</span>, <span class="ruby-identifier">n</span>[<span class="ruby-value">-1</span>] )
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">parsed</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span> <span class="ruby-keyword">and</span> <span class="ruby-identifier">n</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">!=</span> <span class="ruby-value">0</span>
<span class="ruby-identifier">parsed</span>.<span class="ruby-identifier">replace</span>( <span class="ruby-identifier">n</span> )
<span class="ruby-keyword">elsif</span> <span class="ruby-identifier">n</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
<span class="ruby-identifier">parsed</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">n</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">rest</span>
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-get_group" class="method-detail ">
<div class="method-heading">
<span class="method-name">get_group</span><span
class="method-args">(string)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p><a href="XPathParser.html#method-i-get_group"><code>get_group</code></a>( '[foo]bar' ) -> ['bar', '[foo]']</p>
<div class="method-source-code" id="get_group-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/xpathparser.rb, line 612</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">get_group</span> <span class="ruby-identifier">string</span>
<span class="ruby-identifier">ind</span> = <span class="ruby-value">0</span>
<span class="ruby-identifier">depth</span> = <span class="ruby-value">0</span>
<span class="ruby-identifier">st</span> = <span class="ruby-identifier">string</span>[<span class="ruby-value">0</span>,<span class="ruby-value">1</span>]
<span class="ruby-identifier">en</span> = (<span class="ruby-identifier">st</span> <span class="ruby-operator">==</span> <span class="ruby-string">"("</span> <span class="ruby-operator">?</span> <span class="ruby-string">")"</span> <span class="ruby-operator">:</span> <span class="ruby-string">"]"</span>)
<span class="ruby-keyword">begin</span>
<span class="ruby-keyword">case</span> <span class="ruby-identifier">string</span>[<span class="ruby-identifier">ind</span>,<span class="ruby-value">1</span>]
<span class="ruby-keyword">when</span> <span class="ruby-identifier">st</span>
<span class="ruby-identifier">depth</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
<span class="ruby-keyword">when</span> <span class="ruby-identifier">en</span>
<span class="ruby-identifier">depth</span> <span class="ruby-operator">-=</span> <span class="ruby-value">1</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">ind</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
<span class="ruby-keyword">end</span> <span class="ruby-keyword">while</span> <span class="ruby-identifier">depth</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span> <span class="ruby-keyword">and</span> <span class="ruby-identifier">ind</span> <span class="ruby-operator"><</span> <span class="ruby-identifier">string</span>.<span class="ruby-identifier">length</span>
<span class="ruby-keyword">return</span> <span class="ruby-keyword">nil</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">depth</span><span class="ruby-operator">==</span><span class="ruby-value">0</span>
[<span class="ruby-identifier">string</span>[<span class="ruby-identifier">ind</span><span class="ruby-operator">..</span><span class="ruby-value">-1</span>], <span class="ruby-identifier">string</span>[<span class="ruby-value">0</span><span class="ruby-operator">..</span><span class="ruby-identifier">ind</span><span class="ruby-value">-1</span>]]
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
<div id="method-i-parse_args" class="method-detail ">
<div class="method-heading">
<span class="method-name">parse_args</span><span
class="method-args">( string )</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<div class="method-source-code" id="parse_args-source">
<pre><span class="ruby-comment"># File lib/rexml/parsers/xpathparser.rb, line 630</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">parse_args</span>( <span class="ruby-identifier">string</span> )
<span class="ruby-identifier">arguments</span> = []
<span class="ruby-identifier">ind</span> = <span class="ruby-value">0</span>
<span class="ruby-identifier">inquot</span> = <span class="ruby-keyword">false</span>
<span class="ruby-identifier">inapos</span> = <span class="ruby-keyword">false</span>
<span class="ruby-identifier">depth</span> = <span class="ruby-value">1</span>
<span class="ruby-keyword">begin</span>
<span class="ruby-keyword">case</span> <span class="ruby-identifier">string</span>[<span class="ruby-identifier">ind</span>]
<span class="ruby-keyword">when</span> <span class="ruby-value">?"</span>
<span class="ruby-identifier">inquot</span> = <span class="ruby-operator">!</span><span class="ruby-identifier">inquot</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">inapos</span>
<span class="ruby-keyword">when</span> <span class="ruby-value">?'</span>
<span class="ruby-identifier">inapos</span> = <span class="ruby-operator">!</span><span class="ruby-identifier">inapos</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">inquot</span>
<span class="ruby-keyword">else</span>
<span class="ruby-keyword">unless</span> <span class="ruby-identifier">inquot</span> <span class="ruby-keyword">or</span> <span class="ruby-identifier">inapos</span>
<span class="ruby-keyword">case</span> <span class="ruby-identifier">string</span>[<span class="ruby-identifier">ind</span>]
<span class="ruby-keyword">when</span> <span class="ruby-value">?(</span>
<span class="ruby-identifier">depth</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">depth</span> <span class="ruby-operator">==</span> <span class="ruby-value">1</span>
<span class="ruby-identifier">string</span> = <span class="ruby-identifier">string</span>[<span class="ruby-value">1</span><span class="ruby-operator">..</span><span class="ruby-value">-1</span>]
<span class="ruby-identifier">ind</span> <span class="ruby-operator">-=</span> <span class="ruby-value">1</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">when</span> <span class="ruby-value">?)</span>
<span class="ruby-identifier">depth</span> <span class="ruby-operator">-=</span> <span class="ruby-value">1</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">depth</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span>
<span class="ruby-identifier">s</span> = <span class="ruby-identifier">string</span>[<span class="ruby-value">0</span>,<span class="ruby-identifier">ind</span>].<span class="ruby-identifier">strip</span>
<span class="ruby-identifier">arguments</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">s</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">s</span> <span class="ruby-operator">==</span> <span class="ruby-string">""</span>
<span class="ruby-identifier">string</span> = <span class="ruby-identifier">string</span>[<span class="ruby-identifier">ind</span><span class="ruby-value">+1</span><span class="ruby-operator">..</span><span class="ruby-value">-1</span>]
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">when</span> <span class="ruby-value">?,</span>
<span class="ruby-keyword">if</span> <span class="ruby-identifier">depth</span> <span class="ruby-operator">==</span> <span class="ruby-value">1</span>
<span class="ruby-identifier">s</span> = <span class="ruby-identifier">string</span>[<span class="ruby-value">0</span>,<span class="ruby-identifier">ind</span>].<span class="ruby-identifier">strip</span>
<span class="ruby-identifier">arguments</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">s</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">s</span> <span class="ruby-operator">==</span> <span class="ruby-string">""</span>
<span class="ruby-identifier">string</span> = <span class="ruby-identifier">string</span>[<span class="ruby-identifier">ind</span><span class="ruby-value">+1</span><span class="ruby-operator">..</span><span class="ruby-value">-1</span>]
<span class="ruby-identifier">ind</span> = <span class="ruby-value">-1</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span>
<span class="ruby-keyword">end</span>
<span class="ruby-identifier">ind</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
<span class="ruby-keyword">end</span> <span class="ruby-keyword">while</span> <span class="ruby-identifier">depth</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span> <span class="ruby-keyword">and</span> <span class="ruby-identifier">ind</span> <span class="ruby-operator"><</span> <span class="ruby-identifier">string</span>.<span class="ruby-identifier">length</span>
<span class="ruby-keyword">return</span> <span class="ruby-keyword">nil</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">depth</span><span class="ruby-operator">==</span><span class="ruby-value">0</span>
[<span class="ruby-identifier">string</span>,<span class="ruby-identifier">arguments</span>]
<span class="ruby-keyword">end</span></pre>
</div>
</div>
</div>
</section>
</section>
</main>
<footer id="validator-badges" role="contentinfo">
<p><a href="https://validator.w3.org/check/referer">Validate</a>
<p>Generated by <a href="https://ruby.github.io/rdoc/">RDoc</a> 6.2.1.1.
<p>Based on <a href="http://deveiate.org/projects/Darkfish-RDoc/">Darkfish</a> by <a href="http://deveiate.org">Michael Granger</a>.
</footer>