Subject: RE: [xsl] Alternative for breaking out of for-each loop in XSLT From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Fri, 15 Sep 2006 11:38:01 +0100 |
To improve the performance of a look-up like this, use keys. xsl:for-each isn't a loop, it is a mapping function. The concept of breaking out of a mapping function doesn't make sense. You're making the mistake of imagining that it processes each element in order, one at a time, starting at the beginning. Your logic can be vastly simplified. REplace > <xsl:for-each select="document('REC_STATUS.xml')//error/header"> > <xsl:variable name="varFlag"> > <xsl:for-each select="parameter"> > <xsl:if test="@name='code' and @value=$statCode"> > <xsl:text>true</xsl:text> > </xsl:if> > </xsl:for-each> > </xsl:variable> > <xsl:if test="$varFlag='true'"> > <xsl:for-each select="parameter"> > <xsl:if test="@name='value'"> > <xsl:value-of select="@value"/> > </xsl:if> > </xsl:for-each> > </xsl:if> > </xsl:for-each> by: <xsl:value-of select="document('REC_STATUS.xml') //error/header[parameter[@name='code' and @value=$statCode]] /parameter[@name='value']/@value"> (and then replace it by a call on key()) Michael Kay http://www.saxonica.com/ > -----Original Message----- > From: Ambika.Das@xxxxxxxxxxxxxxxxxx > [mailto:Ambika.Das@xxxxxxxxxxxxxxxxxx] > Sent: 15 September 2006 11:23 > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > Subject: [xsl] Alternative for breaking out of for-each loop in XSLT > > Hi, > > I want to read the error description corresponding to error > codes which will be included in the output of the > transformation. The structure of the XML file > (REC_STATUS.xml) containing error codes is as follows. > > <?xml version="1.0" encoding="UTF-8" ?> > > <error> > > <header name="ERR_STATUS"> > <parameter name="value" value="Permission Denied "/> > <parameter name="code" value="1"/> <parameter name="shortStr" > value="BN"/> </header> > > </error> > > There is one XSL file which reads the error code as follows. > > <?xml version="1.0" encoding="UTF-8"?> > <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > version="1.0"> > > <xsl:template name="StatusDesc"> > <xsl:param name="statCode"/> > <xsl:value-of select="$statCode"/> > <xsl:for-each select="document('REC_STATUS.xml')//error/header"> > <xsl:variable name="varFlag"> > <xsl:for-each select="parameter"> > <xsl:if test="@name='code' and @value=$statCode"> > <xsl:text>true</xsl:text> > </xsl:if> > </xsl:for-each> > </xsl:variable> > <xsl:if test="$varFlag='true'"> > <xsl:for-each select="parameter"> > <xsl:if test="@name='value'"> > <xsl:value-of select="@value"/> > </xsl:if> > </xsl:for-each> > </xsl:if> > </xsl:for-each> > </xsl:template> > > </xsl:stylesheet> > > The problem is that, each time I need to get an error > description from the XML file, the whole XML file needs to be > parsed. For example, if the XML file contains 100 error > codes, it requires 100 iterations. Even if the error code is > found, I can't stop the iteration because XSLT doesn't > support breaking out of for each loop. This can lead to > performance issues in production. > > Let me know if the above information is sufficient. > > How can I break out of the for-each loop once the error code is found? > > Thanks & Regards, > Ambika Prasad Das
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] Alternative for breaking out , Ambika.Das | Thread | Re: [xsl] Alternative for breaking , David Carlisle |
[xsl] Alternative for breaking out , Ambika.Das | Date | Re: [xsl] Alternative for breaking , David Carlisle |
Month |