[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

Re: [xsl] would like to simplify my XSLT


Subject: Re: [xsl] would like to simplify my XSLT
From: Glen Mazza <grm7793@xxxxxxxxx>
Date: Mon, 29 Jan 2007 19:26:49 -0800 (PST)

This solved it nicely--thanks George.  It will give me
people who don't have any documents at all, but that's
actually OK for my needs--I just added that caveat
last-second because I (incorrectly, it turns out)
thought it might simplify matters.

Glen

--- George Cristian Bina <george@xxxxxxxxxxxxx> wrote:

> Hi Glen,
> 
> <?xml version="1.0" encoding="US-ASCII"?>
> <xsl:stylesheet
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
> version="1.0">
>    <xsl:template match="/">
>      <people>
>        <xsl:for-each select="data/persons/person">
>          <xsl:if
>
test="not(document[@relid=/data/documents/document/@id])">
>            <name><xsl:value-of
> select="name"/></name>
>          </xsl:if>
>        </xsl:for-each>
>      </people>
>    </xsl:template>
> </xsl:stylesheet>
> 
> Regards,
> George
>
---------------------------------------------------------------------
> George Cristian Bina
> <oXygen/> XML Editor, Schema Editor and XSLT
> Editor/Debugger
> http://www.oxygenxml.com
> 
> 
> Glen Mazza wrote:
> > The following XSLT 1.0 code *works*, but I think
> it
> > can be greatly simplified--I just don't know the
> > construct needed for the simplification.
> > 
> > Given an XML such as this:
> > <data>
> > <documents>
> >   <document id="1"/>
> >   <document id="2"/>
> > </documents>
> > <persons>
> >   <person>
> >         <name>Chris</name>
> > 	<document relid="4"/>
> > 	<document relid="7"/>
> >   </person>
> >   <person>
> >         <name>John</name>
> > 	<document relid="2"/>
> >   </person>
> > </persons>
> > </data>
> > 
> > I want to list all people who *have* documents but
> do
> > *not* have at least one document that is in the
> > <documents> list.  For example, Chris above has no
> > documents in the <documents> list (relid=4 and 7
> > aren't there), so he would get listed, but John
> above
> > wouldn't, because his "2" is in the list.
> > 
> > This is what I've done (pseudocode, so might have
> > minor errors):
> > 
> > <xsl:for-each select="/persons/person">
> > <xsl:variable name="v_DocumentFound">
> >     <xsl:for-each select="document">
> >        <xsl:variable name="v_relid"
> select="@relid"/>
> >        <xsl:if test="count(/documents/document[@id
> =
> > $v_relid]) > 0">
> >            <xsl:text>(document found)</xsl:text>
> >        </xsl:if>
> >     </xsl:for-each>
> > </xsl:variable>
> > <xsl:if
> test="not(boolean(translate($v_DocumentFound,
> > ' ', '')))">
> >       Document was not found for <xsl:value-of
> > select="name"/>
> > </xsl:if>
> > </xsl:for-each>
> > 
> > In other words, I stuff a variable named
> > $v_DocumentFound with text each time a document
> match
> > is found, then check whether the variable is empty
> to
> > see whether or not I need to report something.
> > 
> > Is this the right way of doing what I am trying to
> > accomplish--or is there a simpler method?  Mine
> seems
> > verbose, like I'm missing something obvious.
> > 
> > Thanks,
> > Glen
> > 
> > 
> > 
> >  
> >
>
____________________________________________________________________________________
> > Food fight? Enjoy some healthy debate 
> > in the Yahoo! Answers Food & Drink Q&A.
> >
>
http://answers.yahoo.com/dir/?link=list&sid=396545367
> 
> 



 
____________________________________________________________________________________
Bored stiff? Loosen up... 
Download and play hundreds of games for free on Yahoo! Games.
http://games.yahoo.com/games/front


Current Thread