RE: [xsl] would like to simplify my XSLT

Subject: RE: [xsl] would like to simplify my XSLT
From: cknell@xxxxxxxxxx
Date: Mon, 29 Jan 2007 09:36:44 -0500
Let XPath do the work.

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
  <xsl:strip-space elements="*" />
  <xsl:output method="xml" indent="yes" encoding="UTF-8" />

    <xsl:template match="/">
        <xsl:apply-templates />
    </xsl:template>

    <xsl:template match="data">
      <xsl:apply-templates />
    </xsl:template>
    <xsl:template match="documents" />
    
     <xsl:template match="persons">
       <xsl:apply-templates />
     </xsl:template>
		
     <xsl:template match="person[count(document[@relid = /data/documents/document/@id]) = 0]">
       <xsl:copy-of select="." />
     </xsl:template>
		
     <xsl:template match="person[count(document[@relid = /data/documents/document/@id]) &gt; 0]" />

</xsl:stylesheet>
-- 
Charles Knell
cknell@xxxxxxxxxx - email



-----Original Message-----
From:     Glen Mazza <grm7793@xxxxxxxxx>
Sent:     Mon, 29 Jan 2007 06:08:38 -0800 (PST)
To:       xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject:  [xsl] would like to simplify my XSLT

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

Current Thread