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]) > 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 |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] would like to simplify my, Michael Kay | Thread | [xsl] Flat DB structure into XML Hi, Dave Quested |
RE: [xsl] would like to simplify my, Michael Kay | Date | [xsl] Flat DB structure into XML Hi, Dave Quested |
Month |