Re: Custom function in template match predicate
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).
PURCHASE STYLUS STUDIO ONLINE TODAY!
Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!
Download The World's Best XML IDE!
Accelerate XML development with our award-winning XML IDE - Download a free trial today!
Subscribe in XML format