xsl-list
[Top] [All Lists]

RE: select a node: child of an ancestor

2005-05-19 21:48:10

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