########################################################################
# $Header: /var/local/cvsroot/4Suite/Ft/Xml/Xslt/AttributeValueTemplate.py,v 1.11 2006/08/17 14:53:54 jkloth Exp $
"""
Implementation of XSLT attribute value templates
Copyright 2006 Fourthought, Inc. (USA).
Detailed license and copyright information: http://4suite.org/COPYRIGHT
Project home, documentation, distributions: http://4suite.org/
"""
from Ft.Xml.Xslt import XsltException,Error
from Ft.Xml.XPath import Conversions
import AvtParserc
_AvtParser = AvtParserc.AvtParser()
del AvtParserc
class AttributeValueTemplate:
def __init__(self, source, validator=None, element=None):
self.source = source
self.validator = validator
self.element = element
try:
# parts is a list of unicode and/or parsed XPath
parts = _AvtParser.parse(source)
except SyntaxError, exc:
raise XsltException(Error.AVT_SYNTAX)
self._resultFormat = u""
self._parsedParts = parsed_parts = []
for part in parts:
if isinstance(part, unicode):
if '%' in part:
part = part.replace('%', '%%')
self._resultFormat += part
else:
self._resultFormat += u"%s"
parsed_parts.append(part)
return
def isConstant(self):
return not self._parsedParts
def evaluate(self, context):
if not self.element and hasattr(context, 'currentInstruction'):
self.element = context.currentInstruction
convert = Conversions.StringValue
result = self._resultFormat % tuple([ convert(x.evaluate(context))
for x in self._parsedParts ])
if self.validator:
return self.validator.reprocess(self.element, result)
else:
return result
def __nonzero__(self):
return self.source is not None
|