Subject: RE: 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: 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/
|