Hi Mary,
Here is a repro. Basically, the stylesheet matches the element `elem`
in no namespace, and provides a default rule for all elements. It
return some info about which rule matched and about the element. The
stylesheet root element has the default namespace set to `ns` (even
though it's never used).
The overall query applies the stylesheet to an element `elem`, both in
no namespace and in namespace `ns`, with several dialects set on the
stylesheet (or none at all).
The full result is below, but basically it all comes down to this:
<elem xmlns=""/> | no dialect | match="elem"
<elem xmlns=""/> | any dialect | DOES NOT match="elem"
<elem xmlns="ns"/> | no dialect | does not match="elem"
<elem xmlns="ns"/> | any dialect | DOES match="elem"
The most likely explanation is that the default namespace in scope
applies (wrongly) to the match pattern match="elem", when any dialect
is set. Tested on (same results on all of them):
- 8.0-1.1
- 8.0-3
- 9.0-ea1
The repro code:
declare variable $cases :=
<cases>
<case><elem/></case>
<case xdmp:dialect="1.0-ml"><elem/></case>
<case xdmp:dialect="1.0"><elem/></case>
<case xdmp:dialect="3.0"><elem/></case>
<case xdmp:dialect="3.1"><elem/></case>
<case><elem xmlns="ns"/></case>
<case xdmp:dialect="1.0-ml"><elem xmlns="ns"/></case>
<case xdmp:dialect="1.0"><elem xmlns="ns"/></case>
<case xdmp:dialect="3.0"><elem xmlns="ns"/></case>
<case xdmp:dialect="3.1"><elem xmlns="ns"/></case>
</cases>;
for $c in $cases/*
return
xdmp:xslt-eval(
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="ns"
exclude-result-prefixes="#all"
version="2.0">
{ $c/@xdmp:dialect }
<xsl:template match="elem">
<result dialect="{ $c/@xdmp:dialect }" match="yes" ns="{{
namespace-uri(.) }}" name="{{ local-name(.) }}">
<xsl:sequence select="."/>
</result>
</xsl:template>
<xsl:template match="*">
<result dialect="{ $c/@xdmp:dialect }" match="NO" ns="{{
namespace-uri(.) }}" name="{{ local-name(.) }}">
<xsl:sequence select="."/>
</result>
</xsl:template>
</xsl:stylesheet>,
$c/*)
The full result:
<result dialect="" match="yes" ns="" name="elem" xmlns="ns">
<elem xmlns=""/>
</result>
<result dialect="1.0-ml" match="NO" ns="" name="elem" xmlns="ns">
<elem xmlns=""/>
</result>
<result dialect="1.0" match="NO" ns="" name="elem" xmlns="ns">
<elem xmlns=""/>
</result>
<result dialect="3.0" match="NO" ns="" name="elem" xmlns="ns">
<elem xmlns=""/>
</result>
<result dialect="3.1" match="NO" ns="" name="elem" xmlns="ns">
<elem xmlns=""/>
</result>
<result dialect="" match="NO" ns="ns" name="elem" xmlns="ns">
<elem/>
</result>
<result dialect="1.0-ml" match="yes" ns="ns" name="elem" xmlns="ns">
<elem/>
</result>
<result dialect="1.0" match="yes" ns="ns" name="elem" xmlns="ns">
<elem/>
</result>
<result dialect="3.0" match="yes" ns="ns" name="elem" xmlns="ns">
<elem/>
</result>
<result dialect="3.1" match="yes" ns="ns" name="elem" xmlns="ns">
<elem/>
</result>
Hope that helps, regards,
--
Florent Georges
http://fgeorges.org/
http://h2oconsulting.be/
On 8 March 2016 at 16:56, Florent Georges <[email protected]> wrote:
> Hi Mary,
>
> Thank you, using xdmp:dialect="3.0" indeed works!
>
> But it seems to have also the side-effect to apply the default namespace in
> scope to match patterns. So if you have, say, the HTML namespace declared
> as the default namespace (which is almost required to generate HTML
> properly), then the following will match elements named `elem` in the HTML
> namespace, instead of in no namespace:
>
> <xsl:template match="elem">
>
> Do you want me to work out a repro?
>
> Regards,
>
> --
> Florent Georges
> http://fgeorges.org/
> http://h2oconsulting.be/
>
>
> On 7 March 2016 at 16:33, Mary Holstege wrote:
>>
>>
>>
>> XPath in an XSLT 2.0 context in MarkLogic uses strict 2.0 conformance mode
>> (same as if you declare the XQuery version as 1.0).
>>
>> There is a hook to use different dialects instead and these have the same
>> impact on XPath in XSLT as they do on XPath in XQuery.
>>
>> Add the attribute xdmp:dialect e.g.
>>
>> <xsl:stylesteet xdmp:dialect="1.0-ml"....
>>
>>
>> //Mary
>>
>> On Sun, 06 Mar 2016 02:34:50 -0800, Florent Georges wrote:
>>
>> > Hi,
>> >
>> > If I try to use the XPath 3.0 mapping operator `!` or the concat
>> > operator
>> > `||`,
>> > MarkLogic throws an error:
>> >
>> > XDMP-EXTENSION: (err:XPST0003) MarkLogic extension syntax used,
>> > simple
>> > mapping expressions are not supported in XSLT mode
>> >
>> > But they are not MarkLogic extensions, they are standard XPath operators
>> > (but
>> > in version 3.0, rather than in version 2.0 supported by XSLT 2.0,
>> > supported
>> > by
>> > MarkLogic.) At least in forward compatibility mode, I think they should
>> > be
>> > "unlocked".
>> >
>> > Well, at least if it is only a matter of "unlocking" them. I assume
>> > they
>> > have
>> > been disabled from XSLT, even although their implementation in XQuery
>> > can be
>> > reused as is, but maybe there is an more profound reason why they were
>> > disabled
>> > in the first place.
>> >
>> > Regards,
>> >
>>
>>
>> --
>> Using Opera's revolutionary email client: http://www.opera.com/mail/
>> _______________________________________________
>> General mailing list
>> [email protected]
>> Manage your subscription at:
>> http://developer.marklogic.com/mailman/listinfo/general
>
>
>
>
--
Florent Georges
http://fgeorges.org/
http://h2oconsulting.be/
_______________________________________________
General mailing list
[email protected]
Manage your subscription at:
http://developer.marklogic.com/mailman/listinfo/general