Skip to content

Instantly share code, notes, and snippets.

@ond1
Created July 25, 2023 18:00
Show Gist options
  • Select an option

  • Save ond1/38f15761c17c8c6b3153752ff77e2c52 to your computer and use it in GitHub Desktop.

Select an option

Save ond1/38f15761c17c8c6b3153752ff77e2c52 to your computer and use it in GitHub Desktop.
SaxonC Python pyunit tests
from tempfile import mkstemp
import pytest
from saxonc@@edition@@ import *
import os
from os.path import isfile
from datetime import datetime as date
@pytest.fixture
def saxonproc():
return PySaxonProcessor()
@pytest.fixture
def files_dir():
return "../samples/php"
@pytest.fixture
def data_dir():
return "../samples/data/"
def test_create_bool():
"""Create SaxonProcessor object with a boolean argument"""
sp1 = PySaxonProcessor(license=True)
sp2 = PySaxonProcessor(license=False)
assert isinstance(sp1, PySaxonProcessor)
assert isinstance(sp2, PySaxonProcessor)
'''@pytest.mark.skip('Error: SaxonDll.processor is nullptr in constructor(configFile)')'''
def test_create_config():
"""Create SaxonProcessor object with a configuration file argument"""
conf_xml = b"""\
<configuration xmlns="http://saxon.sf.net/ns/configuration" edition="HE">
<xslt
initialMode=""
initialTemplate=""
messageReceiver=""
outputUriResolver=""
recoveryPolicy="recoverWithWarnings"
schemaAware="false"
staticErrorListener=""
staticUriResolver=""
styleParser=""
version="3.0"
versionWarning="false">
</xslt>
<xquery
allowUpdate="true"
constructionMode="preserve"
defaultElementNamespace=""
defaultFunctionNamespace="http://www.w3.org/2005/xpath-functions"
emptyLeast="true"
inheritNamespaces="true"
preserveBoundarySpace="false"
preserveNamespaces="true"
requiredContextItemType="document-node()"
schemaAware="false"
staticErrorListener=""
version="3.1"
/>
</configuration>
"""
try:
fd, fname = mkstemp(suffix='.xml')
os.write(fd, conf_xml)
os.close(fd)
if not os.path.exists(fname):
raise IOError('%s does not exist' % fname)
with open(fname, 'r') as f:
print(f.read())
sp = PySaxonProcessor(config_file=fname)
assert isinstance(sp, PySaxonProcessor)
finally:
os.unlink(fname)
def test_create_procs():
"""Create XPathProcessor, XsltProcessor from SaxonProcessor object"""
sp = PySaxonProcessor()
xp = sp.new_xpath_processor()
xsl30 = sp.new_xslt30_processor()
assert isinstance(xp, PyXPathProcessor)
assert isinstance(xsl30, PyXslt30Processor)
def test_version():
"""SaxonProcessor version string content"""
sp = PySaxonProcessor()
ver = sp.version
assert ver.startswith('SaxonC-HE')
assert ver.endswith('from Saxonica')
def test_version2():
"""SaxonProcessor version string content"""
try:
sp = PySaxonProcessor(license=True)
assert sp is not None
ver = sp.version
assert ver.startswith('SaxonC-EE')
assert ver.endswith('from Saxonica')
except Exception as err:
print("Error: ", err)
def test_schema_aware1(saxonproc):
assert saxonproc.is_schema_aware == False
@pytest.mark.skip('Error: icu currently not supported')
def test_icu_lib():
saxonproc = PySaxonProcessor(license=True)
print(saxonproc.version)
xqc = saxonproc.new_xquery_processor()
xqc.set_query_content("format-date(current-date(),'[FNn]','de',(),())")
result = xqc.run_query_to_value()
print("format-date(current-date(),'[FNn]','de',(),()) => " + str(result.head))
assert str(result.head) in "Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag, Sonntag"
xqc.set_query_content("format-integer(33,'[Ww]')")
result2 = xqc.run_query_to_value()
print("format-integer(33,'[Ww]') => " + str(result2))
assert '0033' in str(result2)
xqc.set_query_content("format-integer(33,'Ww')")
result5 = xqc.run_query_to_value()
print("format-integer(33,'Ww') => "+str(result5))
assert 'Thirty Three' in str(result5)
xqc.set_query_content("format-integer(33,'Ww','de')")
result6 = xqc.run_query_to_value()
print("format-integer(33,'Ww','de') => "+str(result6))
assert 'Drei\xadund\xadDreißig' in str(result6)
xqc.set_query_content("format-integer(33,'Ww','cs')")
result7 = xqc.run_query_to_value()
print("format-integer(33,'Ww','cs') => "+str(result7))
assert 'Třicet Tři' in str(result7)
def test_icu_lib_HE():
saxonproc = PySaxonProcessor()
print(saxonproc.version)
xqc = saxonproc.new_xquery_processor()
xqc.set_query_content("format-date(current-date(),'[FNn]','de',(),())")
result = xqc.run_query_to_value()
print("format-date(current-date(),'[FNn]','de',(),()) => " + str(result))
day = date.today().strftime("%A")
assert '[Language: en]'+day in str(result)
xqc.set_query_content("format-integer(33,'[Ww]')")
result2 = xqc.run_query_to_value()
print("format-integer(33,'[Ww]') => " + str(result2))
assert '0033' in str(result2)
xqc.set_query_content("format-integer(33,'Ww')")
result5 = xqc.run_query_to_value()
print("format-integer(33,'Ww') => "+str(result5))
assert 'Thirty Three' in str(result5)
xqc.set_query_content("format-integer(33,'Ww','de')")
result6 = xqc.run_query_to_value()
print("format-integer(33,'Ww','de') => "+str(result6))
assert 'Thirty Three' in str(result6)
xqc.set_query_content("format-integer(33,'Ww','cs')")
result7 = xqc.run_query_to_value()
print("format-integer(33,'Ww','cs') => "+str(result7))
assert 'Thirty Three' in str(result7)
def test_schema_aware2():
''' This unit test requires a valid license - SaxonCEE '''
try:
sp = PySaxonProcessor(license=True)
assert sp.is_schema_aware == True
except Exception as err:
print("Error: ", err)
'''PyXsltProcessor test cases '''
def test_xslt30_processor(data_dir):
sp = PySaxonProcessor()
xsltproc = sp.new_xslt30_processor()
xmlFile = data_dir + "cat.xml"
node_ = sp.parse_xml(xml_file_name=xmlFile)
assert node_ is not None
executable = xsltproc.compile_stylesheet(stylesheet_text="<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='2.0'> <xsl:param name='values' select='(2,3,4)' /><xsl:output method='xml' indent='yes' /><xsl:template match='*'><output><xsl:value-of select='//person[1]'/><xsl:for-each select='$values' ><out><xsl:value-of select='. * 3'/></out></xsl:for-each></output></xsl:template></xsl:stylesheet>")
assert executable is not None
output2 = executable.apply_templates_returning_string(xdm_value=node_)
assert output2 is not None
assert 'text1' in output2
def test_Xslt_from_file1(saxonproc, data_dir):
xsltproc = saxonproc.new_xslt30_processor()
xmlFile = data_dir + 'cat.xml'
result = xsltproc.transform_to_string(source_file=xmlFile, stylesheet_file=data_dir+'test.xsl')
assert result is not None
print(result)
assert 'text3' in result
def test_Xslt_from_file2(saxonproc, data_dir):
xsltproc = saxonproc.new_xslt30_processor()
xmlFile = data_dir+'cat.xml'
result = xsltproc.transform_to_string(source_file=data_dir+'cat.xml', stylesheet_file=data_dir+'test.xsl')
assert result is not None
assert 'text3' in result
def test_Xslt_from_file_error(saxonproc, data_dir):
xsltproc = saxonproc.new_xslt30_processor()
try:
result = xsltproc.transform_to_value(source_file=data_dir+'cat.xml', stylesheet_file=data_dir+'test-error.xsl')
assert result is None
except Exception as err:
print("Error: ", err)
assert True
def test_xslt_parameter(saxonproc, data_dir):
input_ = saxonproc.parse_xml(xml_text="<out><person>text1</person><person>text2</person><person>text3</person></out>")
value1 = saxonproc.make_integer_value(10)
trans = saxonproc.new_xslt30_processor()
trans.set_parameter("numParam",value1)
assert value1 is not None
executable = trans.compile_stylesheet(stylesheet_file=data_dir+"test.xsl")
executable.set_initial_match_selection(xdm_value=input_)
output_ = executable.apply_templates_returning_string()
assert output_ is not None
assert 'text2' in output_
'''PyXslt30Processor test cases '''
def testContextNotRoot(saxonproc):
node = saxonproc.parse_xml(xml_text="<doc><e>text</e></doc>")
trans = saxonproc.new_xslt30_processor()
executable = trans.compile_stylesheet(stylesheet_text="<xsl:stylesheet version='2.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'><xsl:variable name='x' select='.'/><xsl:template match='/'>errorA</xsl:template><xsl:template match='e'>[<xsl:value-of select='name($x)'/>]</xsl:template></xsl:stylesheet>")
assert node is not None
assert isinstance(node, PyXdmNode)
assert len(node.children)>0
eNode = node.children[0].children[0]
assert eNode is not None
executable.set_global_context_item(xdm_item=node)
executable.set_initial_match_selection(xdm_value=eNode)
result = executable.apply_templates_returning_string()
assert result is not None
assert "[" in result
def testResolveUri(saxonproc):
trans = saxonproc.new_xslt30_processor()
executable = trans.compile_stylesheet(stylesheet_text="<xsl:stylesheet version='3.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:err='http://www.w3.org/2005/xqt-errors'><xsl:template name='go'><xsl:try><xsl:variable name='uri' as='xs:anyURI' select=\"resolve-uri('notice trailing space /out.xml')\"/> <xsl:message select='$uri'/><xsl:result-document href='{$uri}'><out/></xsl:result-document><xsl:catch><xsl:sequence select=\"'$err:code: ' || $err:code || ', $err:description: ' || $err:description\"/></xsl:catch></xsl:try></xsl:template></xsl:stylesheet>")
value = executable.call_template_returning_value("go")
assert value is not None
item = value.head
assert "code" in item.string_value
def testEmbeddedStylesheet(saxonproc, data_dir):
trans = saxonproc.new_xslt30_processor()
input_ = saxonproc.parse_xml(xml_file_name=data_dir+"books.xml")
path = "/processing-instruction(xml-stylesheet)[matches(.,'type\\s*=\\s*[''\"\"]text/xsl[''\" \"]')]/replace(., '.*?href\\s*=\\s*[''\" \"](.*?)[''\" \"].*', '$1')"
print(data_dir+"books.xml")
assert input_ is not None
xPathProcessor = saxonproc.new_xpath_processor()
xPathProcessor.set_context(xdm_item=input_)
hrefval = xPathProcessor.evaluate_single(path)
assert hrefval is not None
href = hrefval.string_value
print("href="+href)
assert href != ""
styles_dir = data_dir
executable = trans.compile_stylesheet(stylesheet_file=styles_dir+href)
assert executable is not None
assert isinstance(input_, PyXdmNode)
executable.set_global_context_item(xdm_item=input_)
node = executable.apply_templates_returning_value(xdm_value=input_)
assert node is not None
def testNodeAxis(saxonproc, data_dir):
node_ = saxonproc.parse_xml(xml_text="<out xmlns:my='http://www.example.com/ns/various' xmlns:f='http://www.example.com/ns/various1' xmlns='http://www.example.com'><person>text1</person><person>text2</person></out>")
child = node_.children[0]
assert child is not None
namespaces = child.axis_nodes(8)
assert len(namespaces) > 0
for ns in namespaces:
uri_str = ns.string_value
ns_prefix = ns.name
print("xmlns:" + ns_prefix + "='" + uri_str + "'")
def testCollection(saxonproc, data_dir):
xq = saxonproc.new_xquery_processor()
print(getcwd())
xq.set_query_base_uri(data_dir)
xq.set_query_content("collection('?select=*.xml")
r = xq.run_query_to_value()
assert r is not None
def testXquery_40_functions():
proc = PySaxonProcessor(license=True)
proc.set_configuration_property('http://saxon.sf.net/feature/allowSyntaxExtensions', 'on')
xquery_processor = proc.new_xquery_processor()
result = xquery_processor.run_query_to_value(query_text = 'xquery version "4.0"; parse-html("<p>This is paragraph 1.<p>This is paragraph 2.")', lang= '4.0')
assert "paragraph" in result
def testXquery_40_functions_error():
try:
proc = PySaxonProcessor(license=True)
proc.set_configuration_property('http://saxon.sf.net/feature/allowSyntaxExtensions', 'on')
xquery_processor = proc.new_xquery_processor()
result = xquery_processor.run_query_to_value(query_text = 'xquery version "4.0"; parse-html("<p>This is paragraph 1.<p>This is paragraph 2.")', lang= '3.0')
assert False
except Exception:
assert True
def testContext2NotRootNamedTemplate(saxonproc, files_dir, data_dir):
trans = saxonproc.new_xslt30_processor()
input_ = saxonproc.parse_xml(xml_text="<doc><e>text</e></doc>")
executable = trans.compile_stylesheet(stylesheet_text="<xsl:stylesheet version='2.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'><xsl:variable name='x' select='.'/><xsl:template match='/'>errorA</xsl:template><xsl:template name='main'>[<xsl:value-of select='$x'/>]</xsl:template></xsl:stylesheet>")
assert executable is not None
executable.set_global_context_item(xdm_item=input_)
result = executable.call_template_returning_value("main")
assert result is not None
print(result.head.string_value)
assert "[text]" in result.head.string_value
result2 = executable.call_template_returning_string("main")
print(result2)
assert result2 is not None
assert "text" in result2
def testNamedTemplateDefault(saxonproc, files_dir, data_dir):
trans = saxonproc.new_xslt30_processor()
input_ = saxonproc.parse_xml(xml_text="<doc><e>text</e></doc>")
executable = trans.compile_stylesheet(stylesheet_text = '''
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
expand-text="yes">
<xsl:output method="html" indent="yes" html-version="5"/>
<xsl:template match="/" name="xsl:initial-template">
<html>
<head>
<title>Test</title>
</head>
<body>
<h1>Test</h1>
<ol>
<xsl:iterate select="1 to 5">
<li>Item {.}</li>
</xsl:iterate>
</ol>
</body>
</html>
<xsl:comment>Run with {system-property('xsl:product-name')} {system-property('xsl:product-version')} {system-property('Q{http://saxon.sf.net/}platform')}</xsl:comment>
</xsl:template>
</xsl:stylesheet>
''')
assert executable is not None
result = executable.call_template_returning_string(None)
assert result is not None
assert "Item 3" in result
def testCaseVariantFileLoads(saxonproc, files_dir, data_dir):
trans = saxonproc.new_xslt30_processor()
input_ = saxonproc.parse_xml(xml_text="<doc><e>text</e></doc>")
executable = trans.compile_stylesheet(stylesheet_text = '''
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" expand-text="yes"
xmlns:p="urn:pentecom" xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="p xs">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:mode on-no-match="shallow-copy"/>
<!--only compiles with ;j (java flavor) added to flag-->
<xsl:template match="text()[matches(.,'f?ool','i')]"/>
</xsl:stylesheet>''')
assert executable is not None
def testNamedTemplateToFileDefault(saxonproc):
trans = saxonproc.new_xslt30_processor()
trans.set_cwd(os.getcwd())
input_ = saxonproc.parse_xml(xml_text="<doc><e>text</e></doc>")
executable = trans.compile_stylesheet(stylesheet_text = '''
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
expand-text="yes">
<xsl:output method="html" indent="yes" html-version="5"/>
<xsl:template match="/" name="xsl:initial-template">
<html>
<head>
<title>Test</title>
</head>
<body>
<h1>Test</h1>
<ol>
<xsl:iterate select="1 to 5">
<li>Item {.}</li>
</xsl:iterate>
</ol>
</body>
</html>
<xsl:comment>Run with {system-property('xsl:product-name')} {system-property('xsl:product-version')} {system-property('Q{http://saxon.sf.net/}platform')}</xsl:comment>
</xsl:template>
</xsl:stylesheet>
''')
assert executable is not None
executable.call_template_returning_file(output_file="result_For_call_template.xml")
assert isfile("result_For_call_template.xml") == True
def testUseAssociated(saxonproc, files_dir):
try:
trans = saxonproc.new_xslt30_processor()
foo_xml = files_dir+"/trax/xml/foo.xml"
executable = trans.compile_stylesheet(associated_file=foo_xml)
assert executable is not None
executable.set_initial_match_selection(file_name=foo_xml)
result = executable.apply_templates_returning_string()
assert result is not None
except Exception as e:
print(e)
assert False
def testnullptrStylesheet(saxonproc):
trans = saxonproc.new_xslt30_processor()
try:
result = trans.transform_to_string()
assert result is None
except Exception:
assert True
def testXdmDestination1(saxonproc):
trans = saxonproc.new_xslt30_processor()
executable = trans.compile_stylesheet(stylesheet_text="<xsl:stylesheet version='2.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'><xsl:template name='go'><a/></xsl:template></xsl:stylesheet>")
root = executable.call_template_returning_value("go")
assert isinstance(root, PyXdmValue)
assert root is not None
assert root.head is not None
assert root.head.is_atomic == False
node = root.head
assert node is not None
assert isinstance(node, PyXdmNode)
assert node.node_kind == 9
def testXdmDestinationWithItemSeparator(saxonproc):
trans = saxonproc.new_xslt30_processor()
stylesheetStr = "<xsl:stylesheet version='2.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'><xsl:template name='go'><xsl:comment>A</xsl:comment><out/><xsl:comment>Z</xsl:comment></xsl:template><xsl:output method='xml' item-separator='§'/></xsl:stylesheet>"
executable = trans.compile_stylesheet(stylesheet_text=stylesheetStr)
root = executable.call_template_returning_value("go")
node = root.head
assert "<!--A-->§<out/>§<!--Z-->" == node.__str__()
assert node.node_kind == 9
def testPipeline(saxonproc):
stage1 = saxonproc.new_xslt30_processor()
xsl = "<xsl:stylesheet version='2.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'><xsl:template match='/'><a><xsl:copy-of select='.'/></a></xsl:template></xsl:stylesheet>"
xml = "<z/>"
executable1 = stage1.compile_stylesheet(stylesheet_text=xsl)
in_ = saxonproc.parse_xml(xml_text=xml)
stage2 = saxonproc.new_xslt30_processor()
executable2 = stage2.compile_stylesheet(stylesheet_text=xsl)
stage3 = saxonproc.new_xslt30_processor()
executable3 = stage3.compile_stylesheet(stylesheet_text=xsl)
stage4 = saxonproc.new_xslt30_processor()
executable4 = stage4.compile_stylesheet(stylesheet_text=xsl)
stage5 = saxonproc.new_xslt30_processor()
executable5 = stage5.compile_stylesheet(stylesheet_text=xsl)
assert in_ is not None
executable1.set_property("!omit-xml-declaration", "yes")
executable1.set_property("!indent", "no")
executable1.set_initial_match_selection(xdm_value=in_)
d1 = executable1.apply_templates_returning_value()
assert d1 is not None
executable2.set_property("!omit-xml-declaration", "yes")
executable2.set_property("!indent", "no")
executable2.set_initial_match_selection(xdm_value=d1)
d2 = executable2.apply_templates_returning_value()
assert d2 is not None
executable3.set_property("!omit-xml-declaration", "yes")
executable3.set_property("!indent", "no")
executable3.set_initial_match_selection(xdm_value=d2)
d3 = executable3.apply_templates_returning_value()
assert d3 is not None
executable4.set_property("!omit-xml-declaration", "yes")
executable4.set_property("!indent", "no")
executable4.set_initial_match_selection(xdm_value=d3)
d4 = executable4.apply_templates_returning_value()
assert d3 is not None
executable5.set_property("!indent", "no")
executable5.set_property("!omit-xml-declaration", "yes")
executable5.set_initial_match_selection(xdm_value=d4)
sw = executable5.apply_templates_returning_string()
assert sw is not None
assert "<a><a><a><a><a><z/></a></a></a></a></a>" in sw
def testPipelineShort(saxonproc):
xsl = "<xsl:stylesheet version='2.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'><xsl:template match='/'><a><xsl:copy-of select='.'/></a></xsl:template></xsl:stylesheet>"
xml = "<z/>"
stage1 = saxonproc.new_xslt30_processor()
stage2 = saxonproc.new_xslt30_processor()
executable1 = stage1.compile_stylesheet(stylesheet_text=xsl)
executable2 = stage2.compile_stylesheet(stylesheet_text=xsl)
executable1.set_property("!omit-xml-declaration", "yes")
executable2.set_property("!omit-xml-declaration", "yes")
in_ = saxonproc.parse_xml(xml_text=xml)
assert in_ is not None
executable1.set_initial_match_selection(xdm_value=in_)
out = executable1.apply_templates_returning_value()
assert out is not None
executable2.set_initial_match_selection(xdm_value=out)
sw = executable2.apply_templates_returning_string()
assert "<a><a><z/></a></a>" in sw
def testCallFunction(saxonproc):
source = "<?xml version='1.0'?><xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:f='http://localhost/' version='3.0'> <xsl:function name='f:add' visibility='public'> <xsl:param name='a'/><xsl:param name='b'/> <xsl:sequence select='$a + $b'/></xsl:function> </xsl:stylesheet>"
trans = saxonproc.new_xslt30_processor()
executable = trans.compile_stylesheet(stylesheet_text=source)
paramArr = [saxonproc.make_integer_value(2), saxonproc.make_integer_value(3)]
v = executable.call_function_returning_value("{http://localhost/}add", paramArr)
assert isinstance(v.head, PyXdmItem)
assert v.head.is_atomic
assert v.head.get_atomic_value().integer_value ==5
trans.clear_parameters()
def testCallFunctionArgConversion(saxonproc):
trans = saxonproc.new_xslt30_processor()
source = "<?xml version='1.0'?><xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:f='http://localhost/' version='3.0'> <xsl:function name='f:add' visibility='public'> <xsl:param name='a' as='xs:double'/> <xsl:param name='b' as='xs:double'/> <xsl:sequence select='$a + $b'/> </xsl:function> </xsl:stylesheet>"
executable = trans.compile_stylesheet(stylesheet_text=source)
v = executable.call_function_returning_value("{http://localhost/}add", [saxonproc.make_integer_value(2), saxonproc.make_integer_value(3)])
assert isinstance(v.head, PyXdmItem)
assert v.head.is_atomic
assert v.head.get_atomic_value().double_value == 5.0e0
''' assert ("double", $v.head.get_atomic_value()->getPrimitiveTypeName()
'''
def testCallFunctionWrapResults(saxonproc):
trans = saxonproc.new_xslt30_processor()
source = "<?xml version='1.0'?><xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:f='http://localhost/' version='3.0'> <xsl:param name='x' as='xs:integer'/> <xsl:param name='y' select='.+2'/> <xsl:function name='f:add' visibility='public'> <xsl:param name='a' as='xs:double'/> <xsl:param name='b' as='xs:double'/> <xsl:sequence select='$a + $b + $x + $y'/> </xsl:function> </xsl:stylesheet>"
executable= trans.compile_stylesheet(stylesheet_text=source)
assert executable is not None
executable.set_property("!omit-xml-declaration", "yes")
x = saxonproc.make_integer_value(30)
executable.set_parameter("x", x)
item = saxonproc.make_integer_value(20)
executable.set_global_context_item(xdm_item=item)
arg1 = saxonproc.make_integer_value(2)
arg2 = saxonproc.make_integer_value(3)
sw = executable.call_function_returning_string("{http://localhost/}add", [arg1, arg2])
assert sw is not None
assert "57" in sw
trans.clear_parameters()
def testCallFunctionArgInvalid(saxonproc):
trans = saxonproc.new_xslt30_processor()
source = "<?xml version='1.0'?> <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:f='http://localhost/' version='2.0'><xsl:function name='f:add'> <xsl:param name='a' as='xs:double'/> <xsl:param name='b' as='xs:double'/> <xsl:sequence select='$a + $b'/> </xsl:function> </xsl:stylesheet>"
try:
executable = trans.compile_stylesheet(stylesheet_text=source)
argArr = [saxonproc.make_integer_value(2), saxonproc.make_integer_value(3)]
v = executable.call_function_returning_value("{http://localhost/}add", argArr)
except Exception as err:
assert "Cannot invoke function add#2 externally" in str(err)
def testCallNamedTemplateWithTunnelParams(saxonproc):
trans = saxonproc.new_xslt30_processor()
source = "<?xml version='1.0'?> <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:xs='http://www.w3.org/2001/XMLSchema' version='3.0'> <xsl:template name='t'> <xsl:call-template name='u'/> </xsl:template> <xsl:template name='u'> <xsl:param name='a' as='xs:double' tunnel='yes'/> <xsl:param name='b' as='xs:float' tunnel='yes'/> <xsl:sequence select='$a + $b'/> </xsl:template> </xsl:stylesheet>"
executable = trans.compile_stylesheet(stylesheet_text=source)
executable.set_property("!omit-xml-declaration", "yes")
executable.set_property("tunnel", "true")
aVar = saxonproc.make_double_value(12)
paramArr = {"a":aVar, "b":saxonproc.make_integer_value(5)}
executable.set_initial_template_parameters(True, paramArr)
sw = executable.call_template_returning_string("t")
assert sw is not None
assert "17" in sw
def testCallNamedTemplateWithTunnelParams2(saxonproc):
trans = saxonproc.new_xslt30_processor()
source = "<?xml version='1.0'?> <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:xs='http://www.w3.org/2001/XMLSchema' version='3.0'> <xsl:template name='t'> <xsl:call-template name='u'/> </xsl:template> <xsl:template name='u'> <xsl:param name='a' as='xs:double' tunnel='yes'/> <xsl:param name='b' as='xs:float' tunnel='yes'/> <xsl:sequence select='$a + $b'/> </xsl:template> </xsl:stylesheet>"
executable = trans.compile_stylesheet(stylesheet_text=source)
executable.set_property("!omit-xml-declaration", "yes")
executable.set_property("tunnel", "true")
aVar = saxonproc.make_double_value(12)
executable.set_initial_template_parameters(True, {"a":aVar, "b":saxonproc.make_integer_value(5)})
sw = executable.call_template_returning_string("t")
assert sw is not None
assert "17" in sw
def testCallTemplateRuleWithParams(saxonproc):
trans = saxonproc.new_xslt30_processor()
source = "<?xml version='1.0'?> <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:xs='http://www.w3.org/2001/XMLSchema' version='3.0'> <xsl:template match='*'> <xsl:param name='a' as='xs:double'/> <xsl:param name='b' as='xs:float'/> <xsl:sequence select='name(.), $a + $b'/> </xsl:template> </xsl:stylesheet>"
executable = trans.compile_stylesheet(stylesheet_text=source)
executable.set_property("!omit-xml-declaration", "yes")
paramArr = {"a":saxonproc.make_integer_value(12), "b":saxonproc.make_integer_value(5)}
executable.set_initial_template_parameters(False, paramArr)
in_ = saxonproc.parse_xml(xml_text="<e/>")
executable.set_initial_match_selection(xdm_value=in_)
sw = executable.apply_templates_returning_string()
sw is not None
assert "e 17" in sw
def testApplyTemplatesToXdm(saxonproc):
source = "<?xml version='1.0'?> <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:xs='http://www.w3.org/2001/XMLSchema' version='3.0'> <xsl:template match='*'> <xsl:param name='a' as='xs:double'/> <xsl:param name='b' as='xs:float'/> <xsl:sequence select='., $a + $b'/> </xsl:template> </xsl:stylesheet>"
trans = saxonproc.new_xslt30_processor()
executable = trans.compile_stylesheet(stylesheet_text=source)
executable.set_property("!omit-xml-declaration", "yes")
paramArr = {"a":saxonproc.make_integer_value(12), "b":saxonproc.make_integer_value(5)}
executable.set_initial_template_parameters(False, paramArr)
executable.set_result_as_raw_value(True)
in_put = saxonproc.parse_xml(xml_text="<e/>")
executable.set_initial_match_selection(xdm_value=in_put)
result = executable.apply_templates_returning_value()
assert result is not None
assert result.size == 2
first = result.item_at(0)
assert first.is_atomic == False
assert "e" in first.get_node_value().name
second = result.item_at(1)
assert second.is_atomic
assert second.get_atomic_value().double_value == 17.0
def testItemAtDownCast(saxonproc):
source = "<?xml version='1.0'?> <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:xs='http://www.w3.org/2001/XMLSchema' version='3.0'> <xsl:template match='*'> <xsl:param name='a' as='xs:double'/> <xsl:param name='b' as='xs:float'/> <xsl:sequence select='., $a + $b'/> </xsl:template> </xsl:stylesheet>"
trans = saxonproc.new_xslt30_processor()
executable = trans.compile_stylesheet(stylesheet_text=source)
executable.set_property("!omit-xml-declaration", "yes")
paramArr = {"a":saxonproc.make_integer_value(12), "b":saxonproc.make_integer_value(5)}
executable.set_initial_template_parameters(False, paramArr)
executable.set_result_as_raw_value(True)
in_put = saxonproc.parse_xml(xml_text="<e/>")
executable.set_initial_match_selection(xdm_value=in_put)
result = executable.apply_templates_returning_value()
assert result is not None
assert result.size == 2
first = result.item_at(0)
assert first.is_atomic == False
assert isinstance(first, PyXdmNode)
assert "e" in first.name
second = result.item_at(1)
assert isinstance(second, PyXdmAtomicValue)
assert second.double_value == 17.0
def testResultDocument1(saxonproc):
inputDoc = saxonproc.parse_xml(xml_text="<a>b</a>")
assert inputDoc is not None
xsl = "<xsl:stylesheet version='3.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> <xsl:template match='a'> <c>d</c> </xsl:template> <xsl:template match='whatever'> <xsl:result-document href='out.xml'> <e>f</e> </xsl:result-document> </xsl:template></xsl:stylesheet>"
trans = saxonproc.new_xslt30_processor()
executable = trans.compile_stylesheet(stylesheet_text=xsl)
assert executable is not None
executable.set_initial_match_selection(xdm_value=inputDoc)
xdmValue = executable.apply_templates_returning_value()
assert xdmValue.size == 1
def testResultDocumentAsMap(saxonproc):
inputDoc = saxonproc.parse_xml(xml_text="<a>b</a>")
assert inputDoc is not None
xsl = "<xsl:stylesheet version='3.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'><xsl:template match='a'><xsl:result-document href='out.xml'><e>f</e> </xsl:result-document> <xsl:result-document href='out2.xml'><e>hello</e> </xsl:result-document></xsl:template></xsl:stylesheet>"
trans = saxonproc.new_xslt30_processor()
executable = trans.compile_stylesheet(stylesheet_text=xsl)
assert executable is not None
executable.set_capture_result_documents(True)
executable.set_initial_match_selection(xdm_value=inputDoc)
executable.apply_templates_returning_value()
rdocs_map = executable.get_result_documents()
assert rdocs_map is not None
assert len(rdocs_map) == 2
keysList = [*rdocs_map.keys()]
assert keysList[0].endswith('out.xml')
assert keysList[1].endswith('out2.xml')
assert isinstance(rdocs_map[keysList[0]].head, PyXdmNode)
assert 'hello' in rdocs_map[keysList[1]].head.string_value
def testResultDocumentWitJson(saxonproc):
inputDoc = saxonproc.parse_xml(xml_text="<a>b</a>")
assert inputDoc is not None
xsl = "<xsl:stylesheet version='3.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'><xsl:template match='a'><xsl:result-document href='result-1.json' method='json'><xsl:sequence select='map { \"value\" : \"foo\" }'/></xsl:result-document></xsl:template></xsl:stylesheet>"
trans = saxonproc.new_xslt30_processor()
executable = trans.compile_stylesheet(stylesheet_text=xsl)
assert executable is not None
executable.set_capture_result_documents(True, True)
executable.set_initial_match_selection(xdm_value=inputDoc)
executable.apply_templates_returning_value()
rdocs_map = executable.get_result_documents()
assert rdocs_map is not None
assert len(rdocs_map) == 1
keysList = [*rdocs_map.keys()]
assert keysList[0].endswith('result-1.json')
assert isinstance(rdocs_map[keysList[0]].head, PyXdmMap)
def testApplyTemplatesToFile(saxonproc):
xsl = "<xsl:stylesheet version='3.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> <xsl:template match='a'> <c>d</c> </xsl:template></xsl:stylesheet>"
trans = saxonproc.new_xslt30_processor()
executable = trans.compile_stylesheet(stylesheet_text=xsl)
inputDoc = saxonproc.parse_xml(xml_text="<a>b</a>")
inputDoc is not None
executable.set_cwd('.')
executable.set_output_file("output123.xml")
executable.set_initial_match_selection(xdm_value=inputDoc)
executable.apply_templates_returning_file(output_file="output123.xml")
assert isfile("output123.xml") == True
'''@pytest.mark.skip('Error: Test can only run with a license file present')'''
def test_CallTemplateWithResultValidation(files_dir):
try:
saxonproc2 = PySaxonProcessor(license=True)
saxonproc2.set_cwd(files_dir)
trans = saxonproc2.new_xslt30_processor()
source = "<?xml version='1.0'?> <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:xs='http://www.w3.org/2001/XMLSchema' version='3.0' exclude-result-prefixes='#all'> <xsl:import-schema><xs:schema><xs:element name='x' type='xs:int'/></xs:schema></xsl:import-schema> <xsl:template name='main'> <xsl:result-document validation='strict'> <x>3</x> </xsl:result-document> </xsl:template> </xsl:stylesheet>"
executable = trans.compile_stylesheet(stylesheet_text=source)
if executable is not None:
trans.exception_clear
assert executable is not None
executable.set_property("!omit-xml-declaration", "yes")
sw = executable.call_template_returning_string("main")
assert sw is not None
assert "<x>3</x>" == sw
else:
print(trans.error_message)
except Exception as err:
print("Error: ", err)
def testCallTemplateNoParamsRaw(saxonproc):
trans = saxonproc.new_xslt30_processor()
executable = trans.compile_stylesheet(stylesheet_text="<xsl:stylesheet version='2.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'><xsl:template name='xsl:initial-template'><xsl:sequence select='42'/></xsl:template></xsl:stylesheet>")
executable.set_result_as_raw_value(True)
result = executable.call_template_returning_value()
assert result is not None
assert result.head is not None
assert result.head.is_atomic == True
assert result.head.get_atomic_value().integer_value == 42
def testCallNamedTemplateWithParamsRaw(saxonproc):
trans = saxonproc.new_xslt30_processor()
source = "<?xml version='1.0'?> <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:xs='http://www.w3.org/2001/XMLSchema' version='3.0'> <xsl:template name='t'> <xsl:param name='a' as='xs:double'/> <xsl:param name='b' as='xs:float'/> <xsl:sequence select='$a+1, $b+1'/> </xsl:template> </xsl:stylesheet>"
executable = trans.compile_stylesheet(stylesheet_text=source)
executable.set_result_as_raw_value(True)
paramArr = {"a":saxonproc.make_integer_value(12), "b":saxonproc.make_integer_value(5)}
print(paramArr)
executable.set_initial_template_parameters(False, paramArr)
val = executable.call_template_returning_value("t")
assert val is not None
print(val)
assert val.size == 2
assert val.item_at(0).is_atomic
assert val.item_at(0).get_atomic_value().integer_value == 13
assert val.item_at(1).get_atomic_value().integer_value == 6
def testApplyTemplatesRaw(saxonproc):
trans = saxonproc.new_xslt30_processor()
source = "<?xml version='1.0'?> <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:xs='http://www.w3.org/2001/XMLSchema' version='3.0'> <xsl:template match='*'> <xsl:param name='a' as='xs:double'/> <xsl:param name='b' as='xs:float'/> <xsl:sequence select='., $a + $b'/> </xsl:template> </xsl:stylesheet>"
executable = trans.compile_stylesheet(stylesheet_text=source)
node = saxonproc.parse_xml(xml_text="<e/>")
executable.set_result_as_raw_value(True)
paramArr = {"a":saxonproc.make_integer_value(12), "b":saxonproc.make_integer_value(5)}
executable.set_initial_template_parameters(False, paramArr)
executable.set_initial_match_selection(xdm_value=node)
result = executable.apply_templates_returning_value()
assert result is not None
assert result.size ==2
first = result.item_at(0)
assert first is not None
assert first.is_atomic == False
assert first.get_node_value().name == "e"
second = result.item_at(1)
assert second is not None
assert second.is_atomic
assert second.get_atomic_value().double_value == 17.0
def testApplyTemplatesToSerializer(saxonproc):
trans = saxonproc.new_xslt30_processor()
source = "<?xml version='1.0'?> <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:xs='http://www.w3.org/2001/XMLSchema' version='3.0'> <xsl:output method='text' item-separator='~~'/> <xsl:template match='.'> <xsl:param name='a' as='xs:double'/> <xsl:param name='b' as='xs:float'/> <xsl:sequence select='., $a + $b'/> </xsl:template> </xsl:stylesheet>"
executable = trans.compile_stylesheet(stylesheet_text=source)
executable.set_property("!omit-xml-declaration", "yes")
executable.set_result_as_raw_value(True)
paramArr = {"a":saxonproc.make_integer_value(12), "b":saxonproc.make_integer_value(5)}
executable.set_initial_template_parameters(False, paramArr)
executable.set_initial_match_selection(xdm_value=saxonproc.make_integer_value(16))
sw = executable.apply_templates_returning_string()
assert "16~~17" == sw
''' PyXQueryProcessor '''
def test_return_document_node(saxonproc):
node = saxonproc.parse_xml(xml_text='<foo/>')
assert node is not None
xqc = saxonproc.new_xquery_processor()
xqc.set_query_content('document{.}')
xqc.set_context(xdm_item=node)
result = xqc.run_query_to_value()
if isinstance(result, PyXdmNode):
assert result.node_kind == DOCUMENT
def testxQuery1(saxonproc, data_dir):
query_proc = saxonproc.new_xquery_processor()
query_proc.set_cwd(os.getcwd())
saxonproc.set_cwd(os.getcwd())
query_proc.clear_properties()
query_proc.clear_parameters()
xmlFile = data_dir+"cat.xml"
query_proc.set_property("s", xmlFile)
query_proc.set_property("qs", "<out>{count(/out/person)}</out>")
result = query_proc.run_query_to_string()
assert result is not None
print(result)
print(os.getcwd())
query_proc.run_query_to_file(output_file_name="catOutput.xml")
assert os.path.exists("catOutput.xml")
node = saxonproc.parse_xml(xml_file_name='catOutput.xml')
assert node is not None
xp = saxonproc.new_xpath_processor()
xp.set_context(xdm_item=node)
assert xp.effective_boolean_value("/out/text()=3")
if os.path.exists('catOutput.xml'):
os.remove("catOutput.xml")
def testxQuery2(saxonproc, data_dir):
query_proc = saxonproc.new_xquery_processor()
query_proc.set_cwd(os.getcwd())
saxonproc.set_cwd(os.getcwd())
query_proc.clear_properties()
query_proc.clear_parameters()
xmlFile = data_dir+"cat.xml"
query_proc.set_property("s", xmlFile)
query_proc.set_property("qs", "<out>{count(/out/person)}</out>")
result = query_proc.run_query_to_string()
assert result is not None
print(result)
print(os.getcwd())
query_proc.run_query_to_file(output_file_name="catOutput2.xml")
assert os.path.exists("catOutput2.xml")
builder = saxonproc.new_document_builder()
node = builder.parse_xml(xml_file_name='catOutput2.xml')
assert node is not None
xp = saxonproc.new_xpath_processor()
xp.set_context(xdm_item=node)
assert xp.effective_boolean_value("/out/text()=3")
if os.path.exists('catOutput2.xml'):
os.remove("catOutput2.xml")
def test_default_namespace(saxonproc):
query_proc = saxonproc.new_xquery_processor()
query_proc.declare_namespace("", "http://one.uri/")
node = saxonproc.parse_xml(xml_text="<foo xmlns='http://one.uri/'><bar/></foo>")
query_proc.set_context(xdm_item=node)
query_proc.set_query_content("/foo")
value = query_proc.run_query_to_value()
assert value.size == 1
def test_document_builder(saxonproc):
builder = saxonproc.new_document_builder()
builder.set_base_uri("file:/tmp")
node = builder.parse_xml(xml_text="<foo xmlns='http://one.uri/'><bar/></foo>")
assert node is not None
assert node.base_uri == "file:/tmp"
def test_default_namespace2(saxonproc):
query_proc = saxonproc.new_xquery_processor()
query_proc.declare_namespace("", "http://one.uri/")
node = saxonproc.parse_xml(xml_text="<foo xmlns='http://one.uri/'><bar/></foo>")
value = query_proc.run_query_to_value(input_xdm_item=node, query_text="/foo")
assert value.size == 1
def test_XQuery_line_number():
''' No license file given therefore result will return None'''
try:
proc = PySaxonProcessor(license=True)
proc.set_configuration_property("l", "on")
query_proc = proc.new_xquery_processor()
query_proc.set_property("s", "cat.xml")
query_proc.declare_namespace("saxon","http://saxon.sf.net/")
query_proc.set_property("qs", "saxon:line-number(doc('cat.xml')/out/person[1])")
result = query_proc.run_query_to_string()
assert result == None
except Exception as err:
print("Error: ", err)
def testReusability(saxonproc):
queryproc = saxonproc.new_xquery_processor()
queryproc.clear_properties()
queryproc.clear_parameters()
input_ = saxonproc.parse_xml(xml_text="<foo xmlns='http://one.uri/'><bar xmlns='http://two.uri'>12</bar></foo>")
queryproc.declare_namespace("", "http://one.uri/")
queryproc.set_query_content("declare variable $p as xs:boolean external; exists(/foo) = $p")
queryproc.set_context(xdm_item=input_)
value1 = saxonproc.make_boolean_value(True)
queryproc.set_parameter("p",value1)
result = queryproc.run_query_to_value()
item = result.head
assert result is not None
assert item.is_atomic
assert item.boolean_value
queryproc.clear_parameters()
queryproc.clear_properties()
queryproc.declare_namespace("", "http://two.uri")
queryproc.set_query_content("declare variable $p as xs:integer external; /*/bar + $p")
queryproc.set_context(xdm_item=input_)
value2 = saxonproc.make_long_value(6)
queryproc.set_parameter("p",value2)
result2 = queryproc.run_query_to_value()
item2 = result2.head
assert item2.integer_value == 18
def testQueryKeyWords(saxonproc, data_dir):
queryproc = saxonproc.new_xquery_processor()
queryproc.clear_properties()
queryproc.clear_parameters()
input_ = saxonproc.parse_xml(xml_text="<foo xmlns='http://one.uri/'><bar xmlns='http://two.uri'>12</bar></foo>")
queryproc.declare_namespace("", "http://one.uri/")
value1 = saxonproc.make_boolean_value(True)
queryproc.set_parameter("p",value1)
foo_file = data_dir+"/foo.xq"
result = queryproc.run_query_to_value(query_file=foo_file, input_xdm_item=input_)
item = result.head
assert result is not None
assert item.is_atomic
assert item.boolean_value
queryproc.clear_parameters()
queryproc.clear_properties()
def testQueryKeyWords_string(saxonproc, data_dir):
queryproc = saxonproc.new_xquery_processor()
queryproc.clear_properties()
queryproc.clear_parameters()
input_ = saxonproc.parse_xml(xml_text="<foo xmlns='http://one.uri/'><bar xmlns='http://two.uri'>12</bar></foo>")
queryproc.declare_namespace("", "http://one.uri/")
value1 = saxonproc.make_boolean_value(True)
queryproc.set_parameter("p",value1)
foo_file = data_dir+"/foo.xq"
result = queryproc.run_query_to_string(query_file=foo_file, input_xdm_item=input_)
assert result is not None
queryproc.clear_parameters()
queryproc.clear_properties()
def test_make_string_value(saxonproc):
xdm_string_value = saxonproc.make_string_value('text1')
print(xdm_string_value)
xquery_processor = saxonproc.new_xquery_processor()
xquery_processor.set_parameter('s1', xdm_string_value)
result = xquery_processor.run_query_to_value(query_text = 'declare variable $s1 external; $s1')
item1 = result.head
assert result is not None
assert isinstance(item1, PyXdmAtomicValue)
assert item1.string_value == "text1"
"""PyXPathProcessor test cases"""
def test_xpath_proc(saxonproc, data_dir):
sp = saxonproc
xp = saxonproc.new_xpath_processor()
xmlFile = data_dir+"cat.xml"
assert isfile(xmlFile)
xp.set_context(file_name=xmlFile)
assert xp.effective_boolean_value('count(//person) = 3')
assert not xp.effective_boolean_value("/out/person/text() = 'text'")
def test_xpath_proc_http(saxonproc, data_dir):
sp = saxonproc
xp = saxonproc.new_xpath_processor()
xmlFile = data_dir+"cat.xml"
assert isfile(xmlFile)
xp.set_context(file_name=xmlFile)
result = xp.evaluate_single("doc('https://www.w3schools.com/xml/note.xml')")
assert 'Jani' in result.string_value
def test_atomic_values():
sp = PySaxonProcessor()
value = sp.make_double_value(3.5)
boolVal = value.boolean_value
assert boolVal == True
assert value.string_value == '3.5'
assert value.double_value == 3.5
assert value.integer_value == 3
primValue = value.primitive_type_name
assert primValue == 'Q{http://www.w3.org/2001/XMLSchema}double'
def test_node_list():
xml = """\
<out>
<person att1='value1' att2='value2'>text1</person>
<person>text2</person>
<person>text3</person>
</out>
"""
sp = PySaxonProcessor()
node = sp.parse_xml(xml_text=xml)
outNode = node.children[0]
children = outNode.children
personData = str(children)
assert ('<person att1' in personData)
def test_parse_xml_file1():
sp = PySaxonProcessor()
node = sp.parse_xml(xml_file_name='cat.xml')
outNode = node.children[0]
assert outNode.name == 'out'
def test_node():
xml = """\
<out>
<person att1='value1' att2='value2'>text1</person>
<person>text2</person>
<person>text3</person>
</out>
"""
sp = PySaxonProcessor()
node = sp.parse_xml(xml_text=xml)
assert node.node_kind == 9
assert node.size == 1
outNode = node.children[0]
assert outNode.name == 'out'
assert outNode.node_kind == 1
children = outNode.children
attrs = children[1].attributes
assert len(attrs) == 2
assert children[1].get_attribute_value('att2') == 'value2'
assert 'value2' in attrs[1].string_value
def test_evaluate():
xml = """\
<out>
<person att1='value1' att2='value2'>text1</person>
<person>text2</person>
<person>text3</person>
</out>
"""
sp = PySaxonProcessor()
xp = sp.new_xpath_processor()
node = sp.parse_xml(xml_text=xml)
assert isinstance(node, PyXdmNode)
xp.set_context(xdm_item=node)
value = xp.evaluate('//person')
assert isinstance(value, PyXdmValue)
assert value.size == 3
def test_xdm_value_iter():
xml = """\
<out>
<person att1='value1' att2='value2'>text1</person>
<person>text2</person>
<person>text3</person>
</out>
"""
sp = PySaxonProcessor()
xp = sp.new_xpath_processor()
node = sp.parse_xml(xml_text=xml)
assert isinstance(node, PyXdmNode)
xp.set_context(xdm_item=node)
value = xp.evaluate('//person')
assert value.size == 3
for item in value:
assert isinstance(item, PyXdmItem)
def test_xdm_value_iter2():
xml = """\
<out>
<person att1='value1' att2='value2'>text1</person>
<person>text2</person>
<person>text3</person>
</out>
"""
sp = PySaxonProcessor()
xp = sp.new_xpath_processor()
node = sp.parse_xml(xml_text=xml)
assert isinstance(node, PyXdmNode)
xp.set_context(xdm_item=node)
value = xp.evaluate('//person')
assert value.size == 3
for item in value:
assert 'text' in item.string_value
def test_single():
xml = """\
<out>
<person>text1</person>
<person>text2</person>
<person>text3</person>
</out>
"""
sp = PySaxonProcessor()
xp = sp.new_xpath_processor()
node = sp.parse_xml(xml_text=xml)
assert isinstance(node, PyXdmNode)
xp.set_context(xdm_item=node)
item = xp.evaluate_single('//person[1]')
assert isinstance(item, PyXdmItem)
assert item.size == 1
assert not item.is_atomic
assert item.__str__() == '<person>text1</person>'
def test_declare_variable_value1(saxonproc):
mystr = 'This is a test.'
xdm_string_value = saxonproc.make_string_value(mystr)
assert 'This is a test.' in xdm_string_value.string_value
xpath_processor = saxonproc.new_xpath_processor()
xpath_processor.declare_variable("s1")
xpath_processor.set_parameter('s1', xdm_string_value)
result = xpath_processor.evaluate('$s1')
assert result is not None
item = result.head
assert 'test.' in item.string_value
def test_declare_variable_value2(saxonproc):
try:
s1 = 'This is a test.'
xdm_string_value = saxonproc.make_string_value(s1)
xpath_processor = saxonproc.new_xpath_processor()
result = xpath_processor.evaluate('$s1')
assert result is None
except Exception as err:
assert 'No value has been supplied for variable $s1' in str(err)
def test_packages(data_dir):
sp = PySaxonProcessor(license=True)
xsl = """\
<xsl:package name = \"package-002.xsl\" package-version = \"2.1.0.5\"
version = \"3.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">
<xsl:param name='c' select='2'/>
<xsl:mode/>
<xsl:template match='/'>
<out><xsl:apply-templates/></out>
</xsl:template>
<xsl:template match='/*'>
<in><xsl:value-of select='name()'/></in>
</xsl:template>
</xsl:package>
"""
xsltproc = sp.new_xslt30_processor()
xsltproc.compile_stylesheet(stylesheet_text=xsl, save=True, output_file='package02.xsltpack')
xsltproc = None
xsltproc2 = sp.new_xslt30_processor()
xsltproc2.transform_to_string(source_file=data_dir+'books.xml', stylesheet_file="package02.xsltpack")
@pytest.mark.skip('Error: SaxonDll.processor is nullptr in constructor(configFile)')
def test_add_packages(data_dir):
sp = PySaxonProcessor(config_file=data_dir+"config_file.xml")
assert sp is not None
assert isinstance(sp, PySaxonProcessor)
xsl = sp.new_xslt30_processor()
result = xsl.transform_to_string(source_file=data_dir+"package-00.xml", stylesheet_file=data_dir+"package-019.xsl")
assert result is not None
assert 'You found me!' in result
"""Test case should be run last to test release() """
def test_apply():
with PySaxonProcessor(license=False) as proc:
xsltproc = proc.new_xslt30_processor()
document = proc.parse_xml(xml_text="<out><person>text1</person><person>text2</person><person>text3</person></out>")
executable = xsltproc.compile_stylesheet(stylesheet_text="<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='2.0'> <xsl:param name='values' select='(2,3,4)' /><xsl:output method='xml' indent='yes' /><xsl:template match='*'><output><xsl:value-of select='//person[1]'/><xsl:for-each select='$values' ><out><xsl:value-of select='. * 3'/></out></xsl:for-each></output></xsl:template></xsl:stylesheet>")
executable.set_initial_match_selection(xdm_value=document)
executable.set_global_context_item(xdm_item=document)
output2 = executable.apply_templates_returning_string()
assert output2 is not None
assert output2.startswith('<?xml version="1.0" encoding="UTF-8"?>\n<output>text1<out>6</out')
def testMapOperations(saxonproc):
mymap = {saxonproc.make_string_value("a"):saxonproc.make_integer_value(1), saxonproc.make_string_value("b"):saxonproc.make_integer_value(2),
saxonproc.make_string_value("c"):saxonproc.make_integer_value(3)}
map =saxonproc.make_map(mymap)
assert map is not None
print(map.values())
assert map.map_size == 3
def testMapOperations2(saxonproc):
mymap = {"a":saxonproc.make_integer_value(1), "b":saxonproc.make_integer_value(2),
"c":saxonproc.make_integer_value(3)}
xdmdict = create_xdm_dict(saxonproc, mymap)
map =saxonproc.make_map(xdmdict)
assert map is not None
print(map.values())
assert map.map_size == 3
def testMapOperations3(saxonproc):
thisdict = {"a":1, "b":2,"c":5}
xdmdict = create_xdm_dict(saxonproc, thisdict)
xdm_map =saxonproc.make_map(xdmdict)
assert xdm_map is not None
print(xdm_map.values())
assert xdm_map.map_size == 3
def testMapValues(saxonproc):
mymap = {"a":saxonproc.make_integer_value(1), "b":saxonproc.make_integer_value(2), "c":saxonproc.make_integer_value(5)}
xdmdict = create_xdm_dict(saxonproc, mymap)
map =saxonproc.make_map(xdmdict)
assert map is not None
assert map.map_size == 3
mapList = map.values()
assert len(mapList) == 3
print(mapList)
item = mapList[2].head
assert isinstance(item, PyXdmAtomicValue)
assert item.integer_value == 5
def testXdmArray1(saxonproc):
list1 = [1,2,3]
xdmValueList1 = [saxonproc.make_integer_value(i) for i in list1]
xdmArray1 = saxonproc.make_array(xdmValueList1)
assert xdmArray1 is not None
assert isinstance(xdmArray1, PyXdmArray)
assert xdmArray1.array_length == 3
def testMapPutOperations(saxonproc):
mymap = {saxonproc.make_string_value("a"):saxonproc.make_integer_value(1)}
map =saxonproc.make_map(mymap)
assert map is not None
map1= map.put(saxonproc.make_string_value("b"), saxonproc.make_integer_value(2))
assert map1 is not None
map2 = map1.put(saxonproc.make_string_value("c"), saxonproc.make_integer_value(3))
assert map2 is not None
assert map2.map_size == 3
def testConversionFromPythonMap(saxonproc):
mymap = {saxonproc.make_string_value("a"):saxonproc.make_integer_value(1), saxonproc.make_string_value("b"):saxonproc.make_integer_value(2), saxonproc.make_string_value("c"):saxonproc.make_integer_value(3)}
map =saxonproc.make_map(mymap)
assert map is not None
assert map.map_size == 3
bKey = saxonproc.make_string_value("b")
dVar = map.get(bKey)
assert dVar is not None
print(dVar)
assert dVar.head == 2
cKey = saxonproc.make_string_value("c")
dKey = saxonproc.make_string_value("d")
map = map.remove(cKey)
map = map.remove(dKey)
map = map.put( saxonproc.make_string_value("a"), saxonproc.make_integer_value(4))
assert map.map_size == 2
aVar = map.get("a")
assert aVar is not None
aVar.head.integer_value == 4
def testArrayFromList(saxonproc):
list1 = [1,2,3]
xdmValueList1 = [saxonproc.make_integer_value(i) for i in list1]
assert xdmValueList1 is not None
xdmArray1 = saxonproc.make_array(xdmValueList1)
assert xdmArray1 is not None
assert isinstance(xdmArray1, PyXdmArray)
assert xdmArray1.array_length == 3
list1FromXdmArray = xdmArray1.as_list()
assert list1FromXdmArray is not None
assert len(list1FromXdmArray) == 3
assert isinstance(list1FromXdmArray[0].head.get_atomic_value(), PyXdmAtomicValue)
assert list1FromXdmArray[0].head.get_atomic_value().integer_value == 1
assert list1FromXdmArray[1].head.get_atomic_value().integer_value == 2
def testMapAsFunction():
with PySaxonProcessor(license=False) as saxonproc:
mymap = {"a":saxonproc.make_integer_value(1), "b":saxonproc.make_integer_value(2), "c":saxonproc.make_integer_value(3)}
xdmdict = create_xdm_dict(saxonproc, mymap)
map =saxonproc.make_map(xdmdict)
assert map is not None
cVar = saxonproc.make_string_value("c")
result = map.call(saxonproc, [cVar])
assert result is not None
item = result.head
assert isinstance(item, PyXdmAtomicValue)
assert item.integer_value == 3
assert item.integer_value == 3
def testMapAsQueryParameter():
with PySaxonProcessor(license=False) as saxonproc:
mymap = {saxonproc.make_string_value("a"):saxonproc.make_integer_value(1), saxonproc.make_string_value("b"):saxonproc.make_integer_value(2), saxonproc.make_string_value("c"):saxonproc.make_integer_value(3)}
map =saxonproc.make_map(mymap)
assert map is not None
query = """\
declare namespace m='http://www.w3.org/2005/xpath-functions/map';declare variable $a as map(*) external; m:size($a)
"""
query_proc = saxonproc.new_xquery_processor()
query_proc.set_query_content(query)
query_proc.set_parameter("a", map)
result = query_proc.run_query_to_value()
assert result is not None
assert result.head.integer_value == 3
def testMapAsQueryResult():
with PySaxonProcessor(license=False) as proc:
query = "map{1:2, 2:3, 3:4}"
query_proc = proc.new_xquery_processor()
query_proc.set_query_content(query)
result = query_proc.run_query_to_value()
dvar = result.head
assert isinstance(dvar, PyXdmMap)
assert dvar.map_size == 3
def testMap2():
with PySaxonProcessor(license=False) as proc:
query = "map{1:2, 2:3, 3:4}"
query_proc = proc.new_xquery_processor()
query_proc.set_query_content(query)
result = query_proc.run_query_to_value()
assert result is not None
print(result)
assert isinstance(result, PyXdmValue)
mmVar = result.head
assert mmVar is not None
assert isinstance(mmVar, PyXdmMap)
assert mmVar.map_size == 3
avar = mmVar.get(3)
assert avar is not None
assert avar.head.integer_value == 4
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment