Re: [xsl] Custom function in template match predicate

Subject: Re: [xsl] Custom function in template match predicate
From: Wendell Piez <wapiez@xxxxxxxxxxxxxxxx>
Date: Tue, 23 Sep 2008 13:51:08 -0400
Ian,

Actually the reason this isn't working is has nothing to do with the processor:

<xsl:template match="foo[ my:test('type1',.) = true ]">

The predicated expression "my:test('type1',.) = true" is testing the value returned by the function to the value of the 'true' element child. But there is no foo/true to compare to, hence it's always false.

If you had foo[ my:test('type1',.) = 'true' ] you'd have better luck.

On the other hand, this might be even better:

<xsl:function name="my:test" as="xs:boolean">
   <xsl:param name="fmtcode"/>
   <xsl:param name="context"/>
   <xsl:sequence select="(substring-after($context/@format,':') = $fmtcode)
      and
(namespace-uri-for-prefix(substring-before($context/@format,':'),$context)
       = 'http://example.com/schemas/formats' )/>
</xsl:function>

... and then

<xsl:template match="foo[ my:test('type1',.)]">

(That is, instead of generating and comparing a string, simply generate a Boolean value.)

The @as element indicating the return type of the function is not strictly necessary, but is good practice for several reasons including ease of debugging (you will need to declare the xs: namespace prefix with the XML Schema namespace).


Cheers, Wendell


====================================================================== Wendell Piez mailto:wapiez@xxxxxxxxxxxxxxxx Mulberry Technologies, Inc. http://www.mulberrytech.com 17 West Jefferson Street Direct Phone: 301/315-9635 Suite 207 Phone: 301/315-9631 Rockville, MD 20850 Fax: 301/315-8285 ---------------------------------------------------------------------- Mulberry Technologies: A Consultancy Specializing in SGML and XML ======================================================================

Current Thread