Re: [xsl] Re: Performance observation.
Ihe Onwuka <[email protected]> Tue, 8 Sep 2020 07:37:52 -0400
| Newsgroups | gmane.text.xml.saxon.help,gmane.text.xml.xsl.general.mulberrytech |
|---|---|
| Message-ID | <CALfs7+x4y64gEjXsW+Z=RVD=f4BveH6mCS5fpEwoE3JHzywzWQ@mail.gmail.com> |
xsl:where-populated fluctuates as high as the try catch but at best there is no performance penalty. On Tue, Sep 8, 2020 at 6:19 AM Michael Kay mike-JkSD5nQpfvpWk0Htik3J/[email protected] < xsl-list-service-VWJlPdIPk9umXcTjhJAOxCoMnp2j79Jp@public.gmane.org> wrote: > I'm slightly suprised by the performance effect but it depends how often > the pattern is matched, and what other patterns are present in the > stylesheet. Certainly putting complex logic into patterns can be risky from > a performance point of view. > > How about using xsl:where-populated rather than xsl:try? > > Michael Kay > Saxonica > > On 8 Sep 2020, at 08:16, Ihe Onwuka <[email protected]> wrote: > > The goal is to create a namespace node if the value of xsi:type is a QName. > > The code here simulates the situation > > https://xsltfiddle.liberty-development.net/a9HjZj > > The problem is that this fails if the select evaluates to the empty string. > > <xsl:template match="@xsi:type"> > <xsl:namespace name="{substring-before(.,':')}" > select="$schemas/thing/@targetNamespace"/> > <xsl:next-match/> > </xsl:template> > > Now in the real code the select is actually a key retrieval so looks more > like this > > <xsl:template match="@xsi:type"> > <xsl:namespace name="{substring-before(.,':')}" > select="key('myKey',.,$schemas)/@targetNamespace"/> > <xsl:next-match/> > </xsl:template> > > So in order to avoid failure I tried this > > <xsl:template match="@xsi:type[ > key('myKey',.,$schemas)/@targetNamespace => normalize-space()]"> > <xsl:namespace name="{substring-before(.,':')}" > select="key('myKey',.,$schemas)/@targetNamespace"/> > <xsl:next-match/> > </xsl:template> > > now that works but quadrupled the execution time of the stylesheet. > > Doing it with try catch > > <xsl:template match="@xsi:type"> > <xsl:try> > <xsl:namespace name="{substring-before(.,':')}" > select="key('myKey',.,$schemas)/@targetNamespace"/> > <xsl:catch/> > </xsl:try> > <xsl:next-match/> > </xsl:template> > > is a teenie bit quicker. > > Overall execution time is still tolerable so posting this as an > observation. > > For the XSL list > > Is there a way to code > > <xsl:template match="@xsi:type[ > key('myKey',.,$schemas)/@targetNamespace => normalize-space()]"> > <xsl:namespace name="{substring-before(.,':')}" > select="key('myKey',.,$schemas)/@targetNamespace"/> > <xsl:next-match/> > </xsl:template> > > without repeating the code for the key access thats on the template rule > predicate inside the template rule. > > > > > > _______________________________________________ > saxon-help mailing list archived at http://saxon.markmail.org/ > [email protected] > https://lists.sourceforge.net/lists/listinfo/saxon-help > > > XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list> > EasyUnsubscribe <http://lists.mulberrytech.com/unsub/xsl-list/601651> (by > email <[email protected]?subject=remove>) > _______________________________________________ saxon-help mailing list archived at http://saxon.markmail.org/ [email protected] https://lists.sourceforge.net/lists/listinfo/saxon-help