Get the name of a node
This is an open discussion with 11 replies, filed under XSLT.
Search
I have this XML (see attachement) and I want to recursively loop from
//page[@handle='stiri']//page[@handle='test']to the first /<page/> node from the set.
Well I know the starting node ( @handle='stiri' ) so I don't really need the first node name. But the question remains.
You're doing recursions with named templates. That makes things more complicated... What exactly is it you're trying to do?
What exactly is it you're trying to do?
Generate a translated version of the current page:
This URL from english
domain.com/en/en-page1/en-page2/en-page3/url-p1/url-p2
has to be translated to romanian
domain.com/ro/ro-page1/ro-page2/ro-page3/url-p1/url-p2
You can see from the XML that I have all the necessary strings.
I'm using this template to call himself and after that print the necessary page handles on the link :)
Matching templates are much more suited for recursion. You can recursively parse all page
elements with an attribute handle
set to test
elements and generate a URL out of all lhandle-*
-attributes using
<xsl:template match="page"> <xsl:text><xsl:value-of select="*[@name() == concat("lhandle-", $lang)]" />/<xsl:text> <xsl:apply-templates select="//page[@handle='test'][0]" /> </xsl:template>
Start the first iteration by using
<xsl:variable name="lang" select="'ro'" /> <xsl:apply-templates select="//page[@handle='stiri']" />
One word: elegant.
Let me try this. Brb.
I've changed the above XSLT to suit the usecase you're describing in comment #4
I have to go now. It's urgent. But I'll check it out.
One problem that I noticed from-the-fly.
In my XML there is a 3-level depth from page[@hadle="stiri"]
to page[@hadle="test"]
.
Using <xsl:apply-templates select="//page[@handle='test'][0]" />
will jump over page[@hadle="titlu"]
. I need to process every page child from start node to end node.
Start node : page[@hadle="stiri"]
End node: page[@hadle="test"]
Child(s) from ascending line: page[@hadle="titlu"].
Thanks for the start anyway.
Edit Having this situation, I thought about going from bottom to top. From "end" to "start". This way I know for certain the ascending line.
Oh I think I misunderstood you somewhere. Without testing, this should be your XSLT now:
<xsl:template match="page"> <xsl:text><xsl:value-of select="*[@name() == concat("lhandle-", $lang)]" />/<xsl:text> <xsl:apply-templates select="page[descendant::page[@handle='test']]" /> </xsl:template>
Line 3 matches all page
elements that have a descendant
(an element somewhere in them, even if it's nested within other elements) with @handle='test'
Good idea with descendant::
. I didn't know it exists. I made some syntax corrections and xPath correction but the main idea is good.
<xsl:value-of select="*[name() = concat('lhandle-', $codTara)]" />
Careful with this: xsl:value-of.../>
can't be included inside <xsl:text> </xsl:text>
.
Is it still the case that accessing the node name() is tricky in XSLT 1.0?
I'm trying to retrieve the node name of <mobile nandle-"0987070....
to use in a template along with a few others and can't seem to access the name only the value.
Is there a simple syntax for doing such a match?
Got it.. local-name()
seems to work.
Create an account or sign in to comment.
Is there a way to get the name of the current (or any other) node?
The functions
name()
andlocal-name
returnitem
when called and the functionnode-name()
is not supported in XSLT 1.0.I have this XML (see attachement) and I want to recursively loop from
to the first /<page/> node from the set.
I think the only way would be to add an attribute to every node with the node's name:
This is the template responsible for recursion: