Subject: Re: [xsl] differentiating between *the* document node and anonymous document nodes From: "Chris Papademetrious christopher.papademetrious@xxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Sun, 19 Mar 2023 14:46:59 -0000 |
Thank you Eliot! Yes, the term I was previously trying to remember was "implicit" document node, not "anonymous" document node. And once I added the <xsl:document> constructor within the variable definition, my template works as desired. It adds a bit of bulk to explicitly declare and construct document nodes where they would be implicitly inferred, but I prefer to always explicitly declare the @as type. * Chris From: Eliot Kimber eliot.kimber@xxxxxxxxxxxxxx <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Sent: Sunday, March 19, 2023 10:10 AM To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx Subject: Re: [xsl] differentiating between *the* document node and anonymous document nodes The type document-node() is what you are looking for, but you may need to use the <xsl:document> constructor: <xsl:variable name="result" as="document-node()"> <xsl:document> <xsl:copy select="."> <xsl:apply-templates select="@*, node()"/> </xsl:copy> </xsl:document> </xsl:variable> When no @as is specified the value of the variable will be a document node, per 9.3 Values of Variables and Parameters: If a variable-binding element<https://urldefense.com/v3/__https:/www.w3.org/TR/xslt-30/*dt-variable -binding-element__;Iw!!A4F2R9G_pg!fCt2BdwT5Ikw_Qsf2XLfqCV46bdLpUy-6sOkrkzATha A2AzLrVGEUW4bPu-9pwyt3PrRRjR0u2bZiX0x6a0YlOSaaTW4RKtd68nLzq-mbK-MDjicyM-o$> has no select attribute and has non-empty content (that is, the variable-binding element has one or more child nodes), and has no as attribute, then the content of the variable-binding element specifies the supplied value<https://urldefense.com/v3/__https:/www.w3.org/TR/xslt-30/*dt-supplied-v alue__;Iw!!A4F2R9G_pg!fCt2BdwT5Ikw_Qsf2XLfqCV46bdLpUy-6sOkrkzAThaA2AzLrVGEUW4 bPu-9pwyt3PrRRjR0u2bZiX0x6a0YlOSaaTW4RKtd68nLzq-mbK-MDmvC9_Z1$>. The content of the variable-binding element is a sequence constructor<https://urldefense.com/v3/__https:/www.w3.org/TR/xslt-30/*dt-sequ ence-constructor__;Iw!!A4F2R9G_pg!fCt2BdwT5Ikw_Qsf2XLfqCV46bdLpUy-6sOkrkzATha A2AzLrVGEUW4bPu-9pwyt3PrRRjR0u2bZiX0x6a0YlOSaaTW4RKtd68nLzq-mbK-MDkLAvKys$>; a new document is constructed with a document node having as its children the sequence of nodes that results from evaluating the sequence constructor and then applying the rules given in 5.7.1 Constructing Complex Content<https://urldefense.com/v3/__https:/www.w3.org/TR/xslt-30/*constructin g-complex-content__;Iw!!A4F2R9G_pg!fCt2BdwT5Ikw_Qsf2XLfqCV46bdLpUy-6sOkrkzATh aA2AzLrVGEUW4bPu-9pwyt3PrRRjR0u2bZiX0x6a0YlOSaaTW4RKtd68nLzq-mbK-MDocAaXUE$>. The value of the variable is then a singleton sequence containing this document node. For further information, see 9.4 Creating Implicit Document Nodes<https://urldefense.com/v3/__https:/www.w3.org/TR/xslt-30/*temporary-tre es__;Iw!!A4F2R9G_pg!fCt2BdwT5Ikw_Qsf2XLfqCV46bdLpUy-6sOkrkzAThaA2AzLrVGEUW4bP u-9pwyt3PrRRjR0u2bZiX0x6a0YlOSaaTW4RKtd68nLzq-mbK-MDgF7Ybz5$>. [https://www.w3.org/TR/xslt-30/#variable-values<https://urldefense.com/v3/__h ttps:/www.w3.org/TR/xslt-30/*variable-values__;Iw!!A4F2R9G_pg!fCt2BdwT5Ikw_Qs f2XLfqCV46bdLpUy-6sOkrkzAThaA2AzLrVGEUW4bPu-9pwyt3PrRRjR0u2bZiX0x6a0YlOSaaTW4 RKtd68nLzq-mbK-MDuo-Vd0L$>] So very important to specify @as when you *don't* want a document node (which is usually the case) and useful to specify @as="document-node()" when you really do want a document node (for example, because you will be applying key() to the value of the variable, which requires a document and not just an element). This is a particularly subtle aspect of XSLT 2+ and can lead to some subtle bugs, especially when migrating from XSLT 1 (no @as) to XSLT 2+. Cheers, E. _____________________________________________ Eliot Kimber Sr Staff Content Engineer O: 512 554 9368 M: 512 554 9368 servicenow.com<https://urldefense.com/v3/__https:/www.servicenow.com__;!!A4F2 R9G_pg!fCt2BdwT5Ikw_Qsf2XLfqCV46bdLpUy-6sOkrkzAThaA2AzLrVGEUW4bPu-9pwyt3PrRRj R0u2bZiX0x6a0YlOSaaTW4RKtd68nLzq-mbK-MDi0cKdc-$> LinkedIn<https://urldefense.com/v3/__https:/www.linkedin.com/company/servicen ow__;!!A4F2R9G_pg!fCt2BdwT5Ikw_Qsf2XLfqCV46bdLpUy-6sOkrkzAThaA2AzLrVGEUW4bPu- 9pwyt3PrRRjR0u2bZiX0x6a0YlOSaaTW4RKtd68nLzq-mbK-MDoPzE-bV$> | Twitter<https://urldefense.com/v3/__https:/twitter.com/servicenow__;!!A4F2R9G _pg!fCt2BdwT5Ikw_Qsf2XLfqCV46bdLpUy-6sOkrkzAThaA2AzLrVGEUW4bPu-9pwyt3PrRRjR0u 2bZiX0x6a0YlOSaaTW4RKtd68nLzq-mbK-MDkvQFiDU$> | YouTube<https://urldefense.com/v3/__https:/www.youtube.com/user/servicenowinc __;!!A4F2R9G_pg!fCt2BdwT5Ikw_Qsf2XLfqCV46bdLpUy-6sOkrkzAThaA2AzLrVGEUW4bPu-9p wyt3PrRRjR0u2bZiX0x6a0YlOSaaTW4RKtd68nLzq-mbK-MDic805zr$> | Facebook<https://urldefense.com/v3/__https:/www.facebook.com/servicenow__;!!A 4F2R9G_pg!fCt2BdwT5Ikw_Qsf2XLfqCV46bdLpUy-6sOkrkzAThaA2AzLrVGEUW4bPu-9pwyt3Pr RRjR0u2bZiX0x6a0YlOSaaTW4RKtd68nLzq-mbK-MDpGaLGgM$> XSL-List info and archive<https://urldefense.com/v3/__http:/www.mulberrytech.com/xsl/xsl-list__ ;!!A4F2R9G_pg!fCt2BdwT5Ikw_Qsf2XLfqCV46bdLpUy-6sOkrkzAThaA2AzLrVGEUW4bPu-9pwy t3PrRRjR0u2bZiX0x6a0YlOSaaTW4RKtd68nLzq-mbK-MDtzQkBBm$> EasyUnsubscribe<https://urldefense.com/v3/__http:/lists.mulberrytech.com/unsu b/xsl-list/3380743__;!!A4F2R9G_pg!fCt2BdwT5Ikw_Qsf2XLfqCV46bdLpUy-6sOkrkzATha A2AzLrVGEUW4bPu-9pwyt3PrRRjR0u2bZiX0x6a0YlOSaaTW4RKtd68nLzq-mbK-MDkkHDExr$> (by email<>)
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] differentiating between *, Eliot Kimber eliot.k | Thread | Re: [xsl] differentiating between *, Michael Kay michaelk |
Re: [xsl] differentiating between *, Eliot Kimber eliot.k | Date | [xsl] storing the results of <xsl:a, Chris Papademetrious |
Month |