Hi all,

Consider the following XML:

<?xml version="1.0" encoding="UTF-8"?>
<document>
  <chapter name="a">
    <section ref="1" />
    <section ref="2" />
  </chapter>
  <chapter name="b">
    <section ref="1" />
    <section ref="2" />
  </chapter>
</document>

I have implemented the following extension function, just to trace the extension calls:

        public static boolean dummy(final boolean flag) {
                System.out.println(flag);
                return flag;
        }


and the following XSL:


<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
  xmlns:utils="my.XslUtils"
  xmlns:xalan="http://xml.apache.org/xalan";
  extension-element-prefixes="utils">

  <xsl:output method="xml" indent="yes" encoding="UTF-8"
    media-type="text/xml" xalan:indent-amount="2" />

  <xsl:strip-space elements="*" />

  <xsl:template match="/document">
    <document-report>
      <xsl:for-each select="descendant::section[utils:dummy(true())][1]">
<section-report ref="{...@ref}" proc-ref="{ancestor::chapter/@name}" />
      </xsl:for-each>
    </document-report>
  </xsl:template>

</xsl:stylesheet>


In this case the console will show that dummy() was called *once* and the output report will be:

<?xml version="1.0" encoding="UTF-8"?>
<document-report xmlns:xalan="http://xml.apache.org/xalan";>
  <section-report proc-ref="a" ref="1"/>
</document-report>


The problem is with the variants of descendant::section[utils:dummy(true())][1]:

 1. xsl variables:

<xsl:variable name="sections" select="descendant::section" />

and then use this XPath expression instead

xalan:nodeset($sections)[utils:dummy(true())][1]

then the dummy() function will be called 4 times (while the output xml will remain the same) !


 2. paths with more than one fragments:

(chapter/section[utils:dummy(true())])[1]
(chapter/section)[utils:dummy(true())][1]
((chapter/section)[utils:dummy(true())])[1]

in these cases the dummy() function is called 4 times too (while the output xml still remains the same) !


What is the reason of this behavior?
Do I miss something?

Regards,
Adrian.

Reply via email to