Subject: [xsl] surprised about the results of a filter expression in XSLT2.0 From: alan.painter@xxxxxxxxx Date: Thu, 11 May 2006 18:29:55 +0200 |
I'm surprised to see that a filter expression, applied in this case to a variable, produces more elements in the result than there are elements in the variable. In this case, it produces the cartesian product of the number of elements in the variable and the number of combinations in the list that comprises the predicate. I'm assuming that this is normal. Where can I find this behavio(u)r described in the XSLT spec? Thanks for any pointers. In Saxon 8.7.1 (perhaps elsewhere but haven't tested), in the below stylesheet, the instruction <xsl:copy-of select="$idElements[@id=$hrefs]"/> produces <idElement id="_123"/> <idElement id="_123"/> <idElement id="_123"/> <idElement id="_456"/> <idElement id="_456"/> <idElement id="_456"/> whereas the instruction <xsl:copy-of select="$idElements[@id=distinct-values($hrefs)]"/> produces <idElement id="_123"/> <idElement id="_456"/> Here's the stylesheet <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0"> <xsl:output method="xml" encoding="ISO-8859-1" indent="yes"/> <xsl:variable name="testdoc"> <root> <refElement name="element1"> <ref href="_123"/> </refElement> <refElement name="element2"> <ref href="_123"/> </refElement> <refElement name="element3"> <ref href="_123"/> </refElement> <refElement name="element4"> <ref href="_456"/> </refElement> <refElement name="element5"> <ref href="_456"/> </refElement> <refElement name="element6"> <ref href="_456"/> </refElement> <idElement id="_123"/> <idElement id="_456"/> <idElement id="_789"/> </root> </xsl:variable> <xsl:variable name="idElements" select="$testdoc//idElement"/> <xsl:template match="/"> <xsl:apply-templates select="$testdoc" mode="inTestDoc"/> </xsl:template> <xsl:template match="*" mode="inTestDoc"> <xsl:variable name="hrefs" as="xs:string*" select="$testdoc//@href"/> <xsl:copy> <!-- Case 1 --> <xsl:copy-of select="$idElements[@id=$hrefs]"/> <!-- Case 2 --> <!-- <xsl:copy-of select="$idElements[@id=distinct-values($hrefs)]"/> --> </xsl:copy> </xsl:template> </xsl:stylesheet> Output of case 1: <?xml version="1.0" encoding="ISO-8859-1"?> <root xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <idElement id="_123"/> <idElement id="_123"/> <idElement id="_123"/> <idElement id="_456"/> <idElement id="_456"/> <idElement id="_456"/> </root> Output of case 2: <?xml version="1.0" encoding="ISO-8859-1"?> <root xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <idElement id="_123"/> <idElement id="_456"/> </root> -alan ************************************************************************* This message and any attachments (the "message") are confidential and intended solely for the addressee(s). Any unauthorised use or dissemination is prohibited. E-mails are susceptible to alteration. Neither SOCIETE GENERALE nor any of its subsidiaries or affiliates shall be liable for the message if altered, changed or falsified. ************ Ce message et toutes les pieces jointes (ci-apres le "message") sont confidentiels et etablis a l'intention exclusive de ses destinataires. Toute utilisation ou diffusion non autorisee est interdite. Tout message electronique est susceptible d'alteration. La SOCIETE GENERALE et ses filiales declinent toute responsabilite au titre de ce message s'il a ete altere, deforme ou falsifie. *************************************************************************
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] bug fo:footnote with FOP ?, Philippe Drix | Thread | RE: [xsl] surprised about the resul, Michael Kay |
Re: [xsl] XSLT 2.0 Vs XSLT 1.0, Tech Savvy | Date | Re: [xsl] Removing duplicates after, David Carlisle |
Month |