1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
########################################################################
#
# File Name: ParsedRelativePathPattern.py
#
#
"""
Parse class to handle XSLT RelativePathPattern patterns
WWW: http://4suite.com/4XSLT e-mail: support@4suite.com
Copyright (c) 1999-2000 Fourthought Inc, USA. All Rights Reserved.
See http://4suite.com/COPYRIGHT for license and copyright information
"""
from xml.dom import Node
from xml.xpath import ParsedToken
from xml.xslt import XsltException, Error, XPattern
class RelativePathPattern(ParsedToken.ParsedToken):
def __init__(self, op, parent, step):
ParsedToken.ParsedToken.__init__(self, 'RELATIVE_PATH_PATTERN')
self._op = op
self._parent = parent
self._step = step
self.priority = self._step.priority
def getShortcut(self):
return (self, None)
def pprint(self, indent=''):
print indent + str(self)
self._parent.pprint(indent + ' ')
self._step.pprint(indent + ' ')
def __str__(self):
return '<%s(RelativePathPattern) at %x: %s>' % (
self.__class__.__name__,
id(self),
repr(self))
def __repr__(self):
return repr(self._parent) + self._op + repr(self._step)
class RelativeParentPattern(RelativePathPattern):
"""RelativePathPattern: RelativePathPattern '/' StepPattern"""
def __init__(self, parent, step):
RelativePathPattern.__init__(self, '/', parent, step)
def match(self, context, node):
if self._step.match(context, node):
if node.nodeType == Node.ATTRIBUTE_NODE:
node = node.ownerElement
else:
node = node.parentNode
if node:
return self._parent.match(context, node)
return 0
class RelativeAncestorPattern(RelativePathPattern):
"""RelativePathPattern: RelativePathPattern '//' StepPattern"""
def __init__(self, parent, step):
RelativePathPattern.__init__(self, '//', parent, step)
def match(self, context, node):
if self._step.match(context, node):
if node.nodeType == Node.ATTRIBUTE_NODE:
node = node.ownerElement
else:
node = node.parentNode
while node:
if self._parent.match(context, node):
return 1
node = node.parentNode
return 0
|