[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: XSLT 4 xsl:with
Maybe we don't need a new instruction for switching context. We could
re-use the @context-item attribute that already is allowed on
xsl:evaluate. If used on a non-xsl element, the attribute will become
@xsl:context-item.
A contrived example follows. Consider this variable: <xsl:variable name="baz" as="element(baz)"> <baz> <bar> <foo n="1"/> <foo n="2"/> </bar> </baz> </xsl:variable> Then a template might create this output tree: <xsl:for-each select="$baz/bar"> <td> Count of foo elements in {path()}: <xsl:value-of select="count(foo)"/> </td> </xsl:for-each> (The stylesheet author preferred to switch context to $baz/bar in order to "simplify" expressions.) With @xsl:context-item, this can be written as: <td xsl:context-item="$baz/bar"> Count of foo elements in {path()}: <xsl:value-of select="count(foo)"/> </td> or in an xsl:message: <xsl:message context-item="$baz/bar"> Count of foo elements in {path()}: <xsl:value-of select="count(foo)"/> </xsl:message> On elements such as xsl:for-each and xsl:copy, @context-item will have the same semantics as the existing @select attribute. Therefore it need not be allowed on these elements. (Maybe xsl:copy/@select would have better been named @context-item in the first place.) Another example with xsl:choose: <xsl:choose context-item="$baz/bar"> <xsl:when test="count(foo) = 2">...</xsl:when> <xsl:otherwise>...</xsl:otherwise> </xsl:choose> This one combines @context-item with the @select attribute on xsl:when, as proposed by Michael Kay at this year's XML Prague: <xsl:choose> <xsl:when context-item="$baz/bar" test="count(foo) = 2" select="'two'"/> <xsl:when test="count($baz/bar/foo) = 1"> <xsl:sequence select="'one'"/> </xsl:when> <xsl:otherwise>...</xsl:otherwise> </xsl:choose> I'm not sure though whether all occasions on which people use xsl:for-each merely to switch context can be substituted with this context-item attribute. Sometimes the xsl:for-each instruction will comprise many result tree elements or XSLT instructions. Then there is no single element to stick the @context-item attribute onto. The common case of one or more xsl:variable declarations in the new context can be replaced by not switching context, but instead by declaring the variables or the first variable with a @context-item: <xsl:variable name="count" as="xs:integer" select="count(foo)" context-item="$baz/bar"/> <xsl:variable name="is-positive" as="xs:boolean" select="$count gt 0"/> (Don't tell me that I don't need all these variables; this is a contrived example.) -- Gerrit On 19.05.2020 14:00, Graydon graydon@xxxxxxxxx wrote: On Tue, May 19, 2020 at 08:53:54AM -0000, Pieter Masereeuw pieter@xxxxxxxxxxxx scripsit:I would be very happy if I could make my intentions clearer by using a real XSLT construct in this situation, such as *<xsl:with select="...">*. The semantics could also help as an assertion that, indeed, the selection has exactly length 1.
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|