deleyd
asked on
Extract Last Node in Variable
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
<xsl:template match="/">
<html>
<body>
<xsl:variable name="v">
<xsl:call-template name="HelloWorld"/>
</xsl:variable>
<xsl:variable name="x" select="v/*[position() != last()]"/>
<xsl:copy-of select="$x"/>
</body>
</html>
</xsl:template>
<xsl:template name="HelloWorld">
<p>Hello world!</p>
<xsl:text>5</xsl:text>
</xsl:template>
</xsl:stylesheet>
I'm trying to strip off the "5" which is appended to the end. My desired output is
<?xml version="1.0" encoding="utf-8"?><html><body><p>Hello world!</p></body></html>
and I would also like to get that "5" into a variable.The debugger shows variable v is:
and variable x is empty (my select isn't working).
Update: I see I forgot the $. Change that line to:
<xsl:variable name="x" select="$v/*[position() != last()]"/>
and now I get an exception which says, "To use a result tree fragment in a path expression, first convert it to a node-set using the msxsl:node-set()". Great. (I actually used to know this stuff a few years ago! I've forgotten it all! How do I convert this to a node-set?)
ASKER CERTIFIED SOLUTION
membership
Create a free account to see this answer
Signing up is free and takes 30 seconds. No credit card required.
You can build a part of that output tree as a result tree fragment in a variable,
but you can only copy that, but not XPath it
using the node-set() function
put this namespace in the stylesheet element
xmlns:msxsl="urn:schemas-m
then you can transform the result tree fragment into a node-set with the extension function msxsl:node-set() and execute an XPath on the node-set
select="msxsl:node-set($v)
Each XSLT1 processor had a variant of the node-set() function, but it caused code to become vendor specific
XSLT2 fixed this by allowing nodesets in variables and address them
so, my next hint to explore Saxon .net ;-)