xsl-list
[Top] [All Lists]

RE: select a node: child of an ancestor

2005-05-19 21:42:19
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".

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


--~------------------------------------------------------------------
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>
--~--