[xsl] Running a stylesheet with Python

Subject: [xsl] Running a stylesheet with Python
From: "dvint@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Tue, 26 Aug 2025 22:34:27 -0000
I'm trying to run a couple of stylesheets directly from Python. In one case the stylesheet is meant to send the output to std out and the other has all the useful output being created/redirected with result-documents. I'm only interested in those result files and nothing going to std out.

It seems that when called from Python it is detecting there is output and errors out saying I didn't provide an output_file value. When I provide an output_file it works and the content is empty.

Is there an easy setting in the stylesheet that I could say - ignore all output? Seems like it could be logically added to the <xsl:output> statement. Knowing that doesn't work, I dug into the stylesheet a little more and I'm not sure where the leak is.

Here is my Python function

from saxonche import *

def run_saxon_py(input_file, xslt_file, output_file=None, TRYREQUEST=None, DEBUG=None):

time_to_wait = 10
time_counter = 0
while not os.path.exists(input_file):
time.sleep(2)
time_counter += 2
print(f"WARNING: Waiting for \"{input_file}\" to exist to apply \"{xslt_file}\".")
if time_counter > time_to_wait:break
try:
with PySaxonProcessor(license=False) as proc:


xsltproc = proc.new_xslt30_processor()
executable = xsltproc.compile_stylesheet(stylesheet_file=xslt_file)



if DEBUG == 'yes':
executable.set_parameter('DEBUG', proc.make_string_value('yes'))


if TRYREQUEST == 'yes':
executable.set_parameter('P1_CONTENT', proc.make_string_value('yes'))


if output_file == None:

print(f"NOW")
messages = executable.transform_to_value(source_file=input_file)
print(messages)
else:
# Perform the transformation and write the output directly to a file
print(f"HERE")
result_file = xsltproc.transform_to_file(
source_file=input_file,
stylesheet_file=xslt_file,
output_file=output_file
)
# print(f"Transformation complete. Output saved to: {result_file}")


except Exception as e:
print(f"ERROR: Unable to apply \"{xslt_file}\" to \"{input_file}\": \n{e}\n")


It gets called like this for the one that fails

run_saxon_py(collection_build_xml, os.path.join(SCRIPT_DIR, navadoc_xsl), TRYREQUEST=TRYREQUEST)

In the navdoc_xsl I start with this:

<xsl:template match="/" priority="10">

		<xsl:variable name="COLLECTION-TITLE"
			select="normalize-space(/build-map/item[@type='startpage']/title)"/>
		<xsl:variable name="START-PAGE"
			select="ping:modularize-path(/build-map/item[@type='startpage']/filepath/relative)"/>


<xsl:call-template name="build-antora-yml"> <xsl:with-param name="COLLECTION-TITLE" select="$COLLECTION-TITLE"/> <xsl:with-param name="START-PAGE" select="$START-PAGE"/> </xsl:call-template>

		<xsl:call-template name="build-playbook-yml">
			<xsl:with-param name="START-PAGE" select="$START-PAGE"/>
			<xsl:with-param name="COLLECTION-TITLE" select="$COLLECTION-TITLE"/>
		</xsl:call-template>

<xsl:result-document method="text" href="{concat($srcPath, $MODULES_LOC, '/ROOT/nav.adoc')}">
<xsl:apply-templates />
</xsl:result-document>


			<!-- Create the Postman partial files -->
		<xsl:for-each select="//item/partial">

			<xsl:apply-templates  select="." mode="partials">
				<xsl:with-param name="topicid" select="parent::item/@id"/>
			</xsl:apply-templates>
		</xsl:for-each>

</xsl:template>

The csll-templates do some processing but each of them writes output to different result-documents. If I comment out the for-each in this template there is no error. So looking at this template that is called I have this:

	<xsl:template match="partial" mode="partials">
		<xsl:param name="topicid" />

<xsl:result-document href="{concat($PARTIALS, $topicid, '_EP.adoc')}">
<xsl:call-template name="endpoint">
<xsl:with-param name="METHOD" select="preceding-sibling::request-type"></xsl:with-param>
</xsl:call-template>
</xsl:result-document>


</xsl:template>

And the endpoint template

	<xsl:template name="endpoint">
		<xsl:param name="METHOD"/>

<xsl:text>[.api_endpoint]</xsl:text><xsl:value-of select="$RETURN"/>
<xsl:text>[source,subs="+attributes,+macros"]</xsl:text><xsl:value-of select="$RETURN"/>
<xsl:text>--</xsl:text><xsl:value-of select="$RETURN"/>
<xsl:value-of select="$METHOD"/><xsl:text> </xsl:text>
<xsl:value-of select="endpoint"/><xsl:value-of select="$RETURN"/>
<xsl:text>--</xsl:text><xsl:value-of select="$RETURN"/>
<xsl:value-of select="$RETURN"/>
</xsl:template>


I'm not seeing where the output is escaping. So I tried getting rid of the call template like this:

<xsl:result-document href="{concat($PARTIALS, $topicid, '_EP.adoc')}">
<!-- <xsl:call-template name="endpoint">
<xsl:with-param name="METHOD" select="preceding-sibling::request-type"></xsl:with-param>
</xsl:call-template>-->


			<xsl:variable name="METHOD"
				select="preceding-sibling::request-type"/>

<xsl:text>[.api_endpoint]</xsl:text><xsl:value-of select="$RETURN"/>
<xsl:text>[source,subs="+attributes,+macros"]</xsl:text><xsl:value-of select="$RETURN"/>
<xsl:text>--</xsl:text><xsl:value-of select="$RETURN"/>
<xsl:value-of select="$METHOD"/><xsl:text> </xsl:text>
<xsl:value-of select="endpoint"/><xsl:value-of select="$RETURN"/>
<xsl:text>--</xsl:text><xsl:value-of select="$RETURN"/>
<xsl:value-of select="$RETURN"/>


</xsl:result-document>

I still get this error that points to the start of the result-document element:

NOW
Error at xsl:result-document on line 68 column 73 of build-xmlTOpartials.xsl:
SXRD0002 The system identifier of the principal output file is unknown
In template rule with match="partial" on line 38 of build-xmlTOpartials.xsl
invoked by xsl:apply-templates at file:///Users/danvint/pubsrc/_src-data-files/API-markdown-adoc/_build-pipeline/_scripts/conversion/build-xmlTOnavadoc.xsl#59
ERROR: Unable to apply "/Users/danvint/pubsrc/_src-data-files/API-markdown-adoc/_build-pipeline/_scripts/conversion/build-xmlTOnavadoc.xsl" to "pingone-for-developers-getting-started-build-map.xml":
The system identifier of the principal output file is unknown. Line number: -1


What am I missing?

..dan

Current Thread