--- Aron Bock <aronbock(_at_)hotmail(_dot_)com> wrote:
Anthony, just your luck there've been at least 3
posts today about just this
business of determining some property of a "related"
node.
So, this XML (yours, extended):
<data>
<LeftNavTree n="1">
<LeftNavParamList>
<SelectedNode>Link 1.1.1</SelectedNode>
</LeftNavParamList>
<TreeNodeList>
<TreeNode>
<NodeID>Link 1</NodeID>
<NodeContent>...</NodeContent>
<TreeNodeList>
<TreeNode>
<NodeID>Link 1.1</NodeID>
<NodeContent>...</NodeContent>
<TreeNodeList>
<TreeNode>
<NodeID>Link 1.1.1</NodeID>
<NodeContent>...</NodeContent>
</TreeNode>
</TreeNodeList>
</TreeNode>
</TreeNodeList>
</TreeNode>
</TreeNodeList>
</LeftNavTree>
<LeftNavTree n="2">
<LeftNavParamList>
<SelectedNode>Link 2.2.2</SelectedNode>
</LeftNavParamList>
<TreeNodeList>
<TreeNode>
<NodeID>Link 2</NodeID>
<NodeContent>...</NodeContent>
</TreeNode>
</TreeNodeList>
</LeftNavTree>
</data>
With this XSL:
<?xml version="1.0" encoding="iso8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<data>
<xsl:apply-templates select="//NodeID"/>
</data>
</xsl:template>
<xsl:template match="NodeID">
<xsl:copy>
<xsl:attribute name="SelectedNode">
<xsl:value-of
select="ancestor::LeftNavTree//SelectedNode[1]"/>
</xsl:attribute>
<xsl:value-of select="."/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Yields this:
<?xml version="1.0" encoding="UTF-8"?>
<data>
<NodeID SelectedNode="Link 1.1.1">Link 1</NodeID>
<NodeID SelectedNode="Link 1.1.1">Link
1.1</NodeID>
<NodeID SelectedNode="Link 1.1.1">Link
1.1.1</NodeID>
<NodeID SelectedNode="Link 2.2.2">Link 2</NodeID>
</data>
Of course, you could optimize this quite a few ways,
but you get the idea.
Regards,
--A
From: Anthony <apwebdesign(_at_)yahoo(_dot_)com>
Reply-To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] select a node: child of an ancestor
Date: Thu, 19 May 2005 16:55:51 -0700 (PDT)
I have the following xml tree, in which I need to
compare the value of <SelectedNode> with <NodeId>
while iterating:
<LeftNavTree>
<LeftNavParamList>
<SelectedNode>Link 1.1.1<</SelectedNode>
</LeftNavParamList>
<TreeNodeList>
<TreeNode>
<NodeID>Link 1</NodeID>
<NodeContent>...</NodeContent>
<TreeNodeList>
<TreeNode>
<NodeID>Link 1.1</NodeID>
<NodeContent>...</NodeContent>
<TreeNodeList>
<TreeNode>
<NodeID>Link 1.1.1</NodeID>
<NodeContent>...</NodeContent>
</TreeNode>
</TreeNodeList>
</TreeNode>
</TreeNodeList>
</TreeNode>
</TreeNodeList>
</LeftNavTree>
There could be more than one LeftNavTree, so
originally I was using this xpath:
//p:LeftNavTree/p:LeftNavParamList/p:SelectedNode
But it's concatonating the values of SelectedNode
from
both LeftNavTree's. I need an xpath expression that
will grab "the SelectedNode element which is a
descendent of the ancestor LeftNavTree element for
the
current node".
Thanks Aaron. Doing the // thing for referencing the
tree was causing me problems in the first place. I
figured out a better way. I would've liked to just set
a global var, but that wasn't possible without any
context. And passing a local var to all my templates
proved undoable, since there can be other standard xml
tags nested inside some of the elements. I would've
had to retrofit all those templates to pass the
parameters along. The thing that works best for me is
the "ancestor::relative/path/to/node".
Anthony
ph: (408) 656-2473
blog: http://www.chovy.com
__________________________________
Do you Yahoo!?
Yahoo! Small Business - Try our new resources site!
http://smallbusiness.yahoo.com/resources/
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--