Re: [xsl] Generically Finding Parent Elements

Subject: Re: [xsl] Generically Finding Parent Elements
From: "Darcy Parker" <darcyparker@xxxxxxxxx>
Date: Tue, 6 May 2008 14:27:17 -0400
Still not sure if the approach is right/optimal.... but if you want
the unique values there is a function called distinct-values() in
XPath 2.0.

Example:
distinct-values(descendant::*[*])

As a suggestion (I am guessing you're just getting started with XSLT
and XPath)  There is a book called XSLT cookbook and it has a chapter
on XPath.  If you read this chapter, I think it will get you started
with thinking about how to construct XPaths.  And as a companion, I
recommend getting Michael Kay's new book.
http://www.amazon.com/XSLT-2-0-XPath-Programmers-Reference/dp/0470192747/ref=pd_bbs_sr_1?ie=UTF8&s=books&qid=1210098105&sr=8-1
 (I have the previous edition and found it invaluable... and I am
expecting this 4th edition to be arriving today from Amazon.)  A book
that I found useful for learning XSLT is Beginning XSLT by Jeni
Tennison.  (I have the 1st edition Beginning XSLT... I think there is
another edition out now.)

On Tue, May 6, 2008 at 2:04 PM, Tim Dexter <timothy.dexter@xxxxxxxxx> wrote:
> OK, so I have working iwht this more
>
>  I now have a nodeset in a variable using
>
>  <xsl:variable name="pval" select="descendant::*[*]">
>
>  to find all the nodes that have children, in the case of my XML I get
>  a node-set thus:
>
>
>  ROOT
>   DEPTS
>   DEPT
>   EMPLOYEES
>    EMPLOYEE
>    EMPLOYEE
>    EMPLOYEE
>   DEPT
>    EMPLOYEES
>     EMPLOYEE
>     EMPLOYEE
>     EMPLOYEE
>
>  Indenting only for readabilty. Now Im after the unique values in that tree ie
>
>
>  ROOT
>   DEPTS
>   DEPT
>   EMPLOYEES
>    EMPLOYEE
>
>  I guess I want to test the current node with the preceding node name
>  but I have got stuck.
>
>  If Im waaay off here please let me know
>
>  Regards
>
>  Tim
>
>
>
>  On Tue, May 6, 2008 at 11:14 AM, Tim Dexter <timothy.dexter@xxxxxxxxx> wrote:
>  > My apologies for not explaining myself fully - I appreciate your time
>  > and effort.
>  >
>  > We have a product that will have XML data coming in from various other
>  > products via a service that will describe the setup of that product
>  > e.g. accounts, company hierarchy, etc. The XML will be hierarchical in
>  > nature - but we will not know how many levels there might be in that
>  > hierarchy. The only fixed point of reference will be the root element
>  > ie we will know its name.
>  >
>  > We want to create a single generic template that can be applied to
>  > these XMLs. There are going to be limitations in the layout but I
>  > wanted to investigate the feasibility of being able to dynamically
>  > loop thru the levels from top to bottom.
>  >
>  > What I wanted to do was to create a variable that would hold the tree
>  > of parent node elements. The XML I posted was just an example of one
>  > such XML - I just wanted to get across the hierarchical nature of the
>  > XML. I would want to generate a tree as follows.
>  >  <ROOT>
>  >   <DEPTS>
>  >    <DEPT>
>  >    <EMPLOYEES>
>  >     <EMPLOYEE>
>  > I would then be able to read the tree and 'for-each' over each level
>  > and render the content in a tabular format. We have developed a
>  > template to render the contents of the data at each layer, if present.
>  >
>  > Another input XML may have more or less levels in the hierarchy and
>  > the element names will be different.
>  >
>  > I have been trying to get this tree using axes only looking for nodes
>  > under the root node that have children to create the tree.
>  >
>  > Hope that is clearer and thanks again for the input
>  >
>  > Regards
>  >
>  > tim
>  >
>  >
>  >
>  >
>  > On Mon, May 5, 2008 at 2:48 PM, Darcy Parker <darcyparker@xxxxxxxxx> wrote:
>  > > Not sure I understand the question... (Also I am confused when you say
>  > > looping... it sounds like you want to match="//EMPLOYEE" or something
>  > > like that, then look up it's parent and perform some templates based
>  > > on it...  That could make the performance poor and the code difficult
>  > > to read.  Are you familiar with using predicates in XPath? Are you
>  > > familiar with xsl:key and key()?  There wasn't enough info in your
>  > > question... something doesn't sound right.)
>  > >
>  > > But to select the root node, it depends on the context the variable is
>  > > being declared.
>  > >
>  > > Perhaps one of these statements will work?
>  > > <xsl:variable name="root" select=".."/>
>  > > <xsl:variable name="root" select="parent::ROOT"/>
>  > > <xsl:variable name="root" select="ancestor::root"/>
>  > > <xsl:variable name="root" select="/"/>
>  > >
>  > > Darcy
>  > >
>  > > On Mon, May 5, 2008 at 4:24 PM, Tim Dexter <timothy.dexter@xxxxxxxxx> wrote:
>  > > > Hi All
>  > > >
>  > > >  Im struggling with a problem. Assume I have the following XML
>  > > >
>  > > >  <?xml version="1.0"?>
>  > > >  <ROOT>
>  > > >   <DEPTS>
>  > > >   <DEPT>
>  > > >    <DEPTNO>10</DEPTNO>
>  > > >    <DEPTNAME>Accounting</DEPTNAME>
>  > > >    <EMPLOYEES>
>  > > >     <EMPLOYEE>
>  > > >      <EMPNUM>10001</EMPNUM>
>  > > >      <EMPNAME>Jo Bloggs</EMPNAME>
>  > > >      <SALARY>100000</SALARY>
>  > > >     </EMPLOYEE>
>  > > >     <EMPLOYEE>
>  > > >      <EMPNUM>10002</EMPNUM>
>  > > >      <EMPNAME>Jo Smother</EMPNAME>
>  > > >      <SALARY>220000</SALARY>
>  > > >     </EMPLOYEE>
>  > > >     <EMPLOYEE>
>  > > >      <EMPNUM>10003</EMPNUM>
>  > > >      <EMPNAME>James Dean</EMPNAME>
>  > > >      <SALARY>1000</SALARY>
>  > > >     </EMPLOYEE>
>  > > >    </EMPLOYEES>
>  > > >   </DEPT>
>  > > >   <DEPT>
>  > > >    <DEPTNO>20</DEPTNO>
>  > > >    <DEPTNAME>Shipping</DEPTNAME>
>  > > >    <EMPLOYEES>
>  > > >     <EMPLOYEE>
>  > > >      <EMPNUM>20001</EMPNUM>
>  > > >      <EMPNAME>Dave Gibbons</EMPNAME>
>  > > >      <SALARY>100000</SALARY>
>  > > >     </EMPLOYEE>
>  > > >     <EMPLOYEE>
>  > > >      <EMPNUM>20002</EMPNUM>
>  > > >      <EMPNAME>John Fisher</EMPNAME>
>  > > >      <SALARY>220000</SALARY>
>  > > >     </EMPLOYEE>
>  > > >     <EMPLOYEE>
>  > > >      <EMPNUM>20003</EMPNUM>
>  > > >      <EMPNAME>Marti Johnson</EMPNAME>
>  > > >      <SALARY>1000</SALARY>
>  > > >     </EMPLOYEE>
>  > > >    </EMPLOYEES>
>  > > >   </DEPT>
>  > > >   </DEPTS>
>  > > >  </ROOT>
>  > > >
>  > > >  This is just a sample XML the XSL template needs to handle any number
>  > > >  of levels in the XML - the only known element is the ROOT name. I need
>  > > >  to be able to pull the parent node tree into a variable so I can then
>  > > >  loop over them. The looping I can handle, any help on grabbing the
>  > > >  parent element names in a tree gratefully received.
>  > > >
>  > > >  Thanks
>  > > >
>  > > >  Tim

Current Thread