Spurious warning: the attribute axis starting at a text node will never select anything
This arises in the XSLT 3.0 test driver written in XSLT (runner/compare.xsl in the W3C test suite). The following two messages appear:
Warning at char 5 in xsl:copy-of/@select on line 156 column 50 of compare.xsl: SXWN9000: The attribute axis starting at a text node will never select anything Warning at char 5 in xsl:copy-of/@select on line 161 column 50 of compare.xsl: SXWN9000: The attribute axis starting at a text node will never select anything
There are two problems:
(a) the messages appear repeatedly; warnings should only appear once.
(b) there's nothing wrong with the code in question. Line 156 is the xsl:copy-of instruction in
<d:_1> <xsl:copy select="$a"> <xsl:copy-of select="$a/@*"/> </xsl:copy> </d:_1>
where $a has a declared type of
#1 Updated by Michael Kay over 3 years ago
The reason for the warning is that the function has been inlined; although $a is declared as
node()?, in a particular invocation (from line 50) the supplied value is known to be a text node, and the calling function is being type-checked after inlining of the called function.
The reason for the multiple warnings, similarly, is that the function has been inlined by several callers and each one is being typechecked independently.
The AxisExpression has flags doneTypeCheck and doneOptimize designed to prevent multiple warnings, but it looks like the expression was copied (during inlining) before these flags were set, and so the flags are false on each copy of the expression, and once this has happened there is no remaining connection between the multiple instances.
#2 Updated by Michael Kay over 3 years ago
- Status changed from New to Resolved
- Priority changed from Low to Normal
- Applies to branch 9.9 added
- Fix Committed on Branch 9.9 added
I have fixed the spurious warnings by adding a flag in ExpressionVisitor that allows warnings to be suppressed, and setting this flag while doing the second type-checking of an inlined function.
While I was at it, I added an optimization rewrite so xsl:copy is replaced by xsl:copy-of if the type is known to be a childless node kind; this causes the body of the xsl:copy to be discarded, which can pave the way for further optimizations, for example if it means that variables are now unreferenced.
Please register to edit this issue