RE: [xsl] select a node: child of an ancestor

Subject: RE: [xsl] select a node: child of an ancestor
From: Anthony <apwebdesign@xxxxxxxxx>
Date: Thu, 19 May 2005 21:48:10 -0700 (PDT)
--- Aron Bock <aronbock@xxxxxxxxxxx> 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@xxxxxxxxx>
> >Reply-To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> >To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> >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/ 

Current Thread