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

Subject: RE: [xsl] select a node: child of an ancestor
From: "Aron Bock" <aronbock@xxxxxxxxxxx>
Date: Fri, 20 May 2005 04:42:19 +0000
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".

_________________________________________________________________
Express yourself instantly with MSN Messenger! Download today - it's FREE! http://messenger.msn.click-url.com/go/onm00200471ave/direct/01/


Current Thread