Failed to compile stylesheet: Focus for child axis is absent with xslt3 while Saxon 9.9 and 10.0 and 10.1 Java compile and execute the code fine
Added by Martin Honnen over 4 years ago
In my fiddles for XQuery and XSLT using Saxon I like to provide users the option to use JSON as the context item/match selection instead of XML. As the command line interfaces of Saxon don't support that I have tried to write the following wrapper stylesheet:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:param name="method" as="xs:string" static="yes" select="'json'"/>
<xsl:param name="xslt-uri" static="yes" as="xs:string?" select="'group-sales-sum-product.xsl'"/>
<xsl:include _href="{$xslt-uri}"/>
<xsl:param name="json-uri" as="xs:string?" select="'sales.json'"/>
<xsl:param name="json-content" as="xs:string?" select="()"/>
<xsl:variable name="input" as="item()" select="if (not(empty($json-uri))) then json-doc($json-uri) else parse-json($json-content)"/>
<xsl:output _method="{$method}" indent="yes"/>
<xsl:template name="xsl:initial-template">
<xsl:apply-templates select="$input"/>
</xsl:template>
</xsl:stylesheet>
I can run that stylesheet fine with Saxon 9.9 or 10.0 or 10.1 HE from the command line, using stylesheets like
<?xml version="1.0" encoding="utf-8"?>
<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">
<xsl:output method="json" indent="yes"/>
<xsl:template match=".">
<xsl:map>
<xsl:for-each-group select="?sales?*" group-by="?product">
<xsl:sort select="current-grouping-key()"/>
<xsl:map-entry key="current-grouping-key()" select="sum(current-group()?quantity)"/>
</xsl:for-each-group>
</xsl:map>
</xsl:template>
</xsl:stylesheet>
as the "dynamic" include which then processes the provided JSON like
{
"sales": [
{
"product": "broiler",
"store number": 1,
"quantity": 20
},
{
"product": "toaster",
"store number": 2,
"quantity": 100
},
{
"product": "toaster",
"store number": 2,
"quantity": 50
},
{
"product": "toaster",
"store number": 3,
"quantity": 50
},
{
"product": "blender",
"store number": 3,
"quantity": 100
},
{
"product": "blender",
"store number": 3,
"quantity": 150
},
{
"product": "socks",
"store number": 1,
"quantity": 500
},
{
"product": "socks",
"store number": 2,
"quantity": 10
},
{
"product": "shirt",
"store number": 3,
"quantity": 10
}
]
}
just fine.
However, when I try to run Saxon-JS 2 using xslt3
that way, I get an error:
PS C:\Users\marti\SomePath\json-input> xslt3 -t -it -xsl:include-wrapper-for-json-input.xsl
Saxon-JS 2.0 from Saxonica
Node.js version v12.18.0
Compiling stylesheet C:\Users\marti\SomePath\json-input\include-wrapper-for-json-input.xsl
Failed to compile stylesheet: Focus for child axis is absent
Error XPDY0002 at static.xsl#392
Failed to compile stylesheet
Error XPDY0002 at static.xsl#392
Focus for child axis is absent
group-sales-sum-product.xsl (594 Bytes) group-sales-sum-product.xsl | |||
include-wrapper-for-json-input.xsl (921 Bytes) include-wrapper-for-json-input.xsl | |||
sales.json (850 Bytes) sales.json |
Replies (2)
RE: Failed to compile stylesheet: Focus for child axis is absent with xslt3 while Saxon 9.9 and 10.0 and 10.1 Java compile and execute the code fine - Added by Michael Kay over 4 years ago
Thanks for reporting it.
static.xsl is the module of the XX compiler that handles static variables, shadow attributes, etc, and the code at #392 is the call on xsl:evaluate
that evaluates the @select
attribute of a static variable or parameter. The failure is then somewhere within the XPath parser. I've no idea why it's trying to use the child axis!
Please register to reply