Error during xslt execution in Saxon HE 9.8.0-14
Added by Vladimir Nesterovsky about 6 years ago
I get an error:
Error at char 18 in xsl:sequence/@select on line 32 column 60 of test.xslt:
FORG0005: A sequence of more than one item is not allowed as the first argument of
fn:exactly-one() (<a/>, <b/>)
at t:f() (...)
A sequence of more than one item is not allowed as the first argument of fn:exactly-one() (<a/>, <b/>)
for a following stylesheet:
<xsl:stylesheet version="3.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:map="http://www.w3.org/2005/xpath-functions/map"
xmlns:t="t">
<xsl:param name="items" as="element()*">
<a pid="1"/>
<b pid="1"/>
<c pid="2"/>
<d pid="2"/>
<e pid="2"/>
</xsl:param>
<xsl:template match="/">
<xsl:message select="t:f($items)"/>
</xsl:template>
<xsl:function name="t:f" as="xs:string*">
<xsl:param name="items" as="element()*"/>
<xsl:variable name="info" as="map(xs:string, element()+)" select="
map:merge
(
$items!map { xs:string(@pid): . },
map { 'duplicates': 'combine' }
)"/>
<xsl:variable name="keys" as="xs:string*" select="$info=>map:keys()"/>
<xsl:sequence select="$keys!exactly-one($info(.)[1])"/>
</xsl:function>
</xsl:stylesheet>
Input xml is anything.
In my opinion there should not be any error.
Replies (2)
RE: Error during xslt execution in Saxon HE 9.8.0-14 - Added by Vladimir Nesterovsky about 6 years ago
I want to add that following does not produce an error:
<xsl:sequence select="$keys!exactly-one($info(.)=>subsequence(1, 1))"/>
Neither error happens if to put logic directly into xsl:template.
RE: Error during xslt execution in Saxon HE 9.8.0-14 - Added by Michael Kay about 6 years ago
I have raised this at
https://saxonica.plan.io/issues/3980
The problem is caused by an incorrect type inference. This causes the compiler to assume that map:merge() will always return a map of type map(xs:string, element())
, which in turn results in the predicate [1]
being dropped as redundant, which then leads to the dynamic error from the call on exactly-one()
.
Please register to reply