Hi Johan, I will file a bug. Can you tell which version of MarkLogic you are running exactly?
Not uncommonly, XSLT transforms like below reorder attributes. Does it make a difference if you try to get the xml:lang attribute first in the XSLT output? Last but not least, is this related to a customer case? It will push up priority if it is.. (you can let me know offline if necessary..) Cheers, Geert On 6/22/15, 5:10 PM, "Johan de Boer" <[email protected]> wrote: >Hi, > >I have discovered that when you use a stylesheet with xdmp:xlst-invoke >to transform your document content in some circumstances attributes >are not indexed as you might expect. > >- If within an element an attribute x appears before the xml:lang >attribute then this attribute x is indexed based on the default >language of the database. >- If within an element an attribute x appears after the xml:lang >attribute then this attribute x is indexed based on the language in >this previous xml:lang attribute. > >Because the default language of the database can differ from the >language in the xml:lang attribute values for attribute x can be found >within different languages. > >After reindexing the database all these attributes x are indexed >according to the xml:lang attribute that appears within the same >element. > >This appears in both Marklogic 7 and Marklogic 8 > >Although this problem can easily be avoided does anyone know if a >certain option within the stylesheet should be used to avoid this? Or >might this perhaps be a bug? > >An example is given below: > >xquery version "1.0-ml"; >declare namespace html = "http://www.w3.org/1999/xhtml"; >import module namespace >search="http://marklogic.com/appservices/search" at >"/MarkLogic/appservices/search/search.xqy"; > >declare variable $SEARCH-OPTIONS := > <options xmlns="http://marklogic.com/appservices/search"> > <search-option>unfiltered</search-option> > <return-query>true</return-query> > <return-results>true</return-results> > > <constraint name="type-de"> > <word> > <attribute ns="" name="type"/> > <element ns="" name="bar"/> > <term-option>lang=de</term-option> > </word> > </constraint> > <constraint name="type-en"> > <word> > <attribute ns="" name="type"/> > <element ns="" name="bar"/> > <term-option>lang=en</term-option> > </word> > </constraint> > </options>; > >let $content1 := ><foo> > <bar type="abc" xml:lang="de"> > </bar> ></foo> > >let $content2 := ><foo> > <bar xml:lang="de" type="def"> > </bar> ></foo> > >(: default database language is 'en' :) > >(: copy-and-paste.xsl is a stylesheet: > ><xsl:stylesheet version="2.0" >xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> > <xsl:template match="@*|node()"> > <xsl:copy> > <xsl:apply-templates select="@*|node()" /> > </xsl:copy> > </xsl:template> ></xsl:stylesheet> >:) > >(: Run 1: I add two documents :) > >(: >let $_ := xdmp:document-insert("/test/foo1",$content1) >let $_ := xdmp:document-insert("/test/foo2",$content2) >return "inserted documents 1 and 2" >:) > >(: Run 2 : I check the number of documents found in each language after >run 1 :) > >(: >let $found-de-abc := search:search("type-de:abc", $SEARCH-OPTIONS)/@total >let $found-en-abc := search:search("type-en:abc", $SEARCH-OPTIONS)/@total >let $found-de-def := search:search("type-de:def", $SEARCH-OPTIONS)/@total >let $found-en-def := search:search("type-en:def", $SEARCH-OPTIONS)/@total >return fn:concat ("Language 'de'/'abc' : ", $found-de-abc," and >language 'en'/'abc' : ", $found-en-abc, " and language 'de'/'def' : ", >$found-de-def," and language 'en'/'def' : ", $found-en-def) >:) > >(: Run 2 returns: >Language 'de'/'abc' : 1 and language 'en'/'abc' : 0 and language >'de'/'def' : 1 and language 'en'/'def' : 0 >:) > >(: Run 3 : I add two more documents based on the previous documents >using xdmp:xlst-invoke and the stylesheet :) > >(: >let $content3 := xdmp:xslt-invoke("/app/xsl/copy-and-paste.xsl", >fn:doc("/test/foo1")) >let $content4 := xdmp:xslt-invoke("/app/xsl/copy-and-paste.xsl", >fn:doc("/test/foo2")) >let $_ := xdmp:document-insert("/test/foo3",$content3) >let $_ := xdmp:document-insert("/test/foo4",$content4) >return "inserted documents 3 and 4" >:) > >(: Run 4 : I check the number of documents found in each language >after run 1 and 2 :) > >(: >let $found-de-abc := search:search("type-de:abc", $SEARCH-OPTIONS)/@total >let $found-en-abc := search:search("type-en:abc", $SEARCH-OPTIONS)/@total >let $found-de-def := search:search("type-de:def", $SEARCH-OPTIONS)/@total >let $found-en-def := search:search("type-en:def", $SEARCH-OPTIONS)/@total >return fn:concat ("Language 'de'/'abc' : ", $found-de-abc," and >language 'en'/'abc' : ", $found-en-abc, " and language 'de'/'def' : ", >$found-de-def," and language 'en'/'def' : ", $found-en-def) >:) > >(: Run 4 returns: >Language 'de'/'abc' : 1 and language 'en'/'abc' : 1 and language >'de'/'def' : 2 and language 'en'/'def' : 0 >:) > >(: Then I reindex the database :) > >(: Run 5 : I check the number of documents found in each language >after reindex :) > >let $found-de-abc := search:search("type-de:abc", $SEARCH-OPTIONS)/@total >let $found-en-abc := search:search("type-en:abc", $SEARCH-OPTIONS)/@total >let $found-de-def := search:search("type-de:def", $SEARCH-OPTIONS)/@total >let $found-en-def := search:search("type-en:def", $SEARCH-OPTIONS)/@total >return fn:concat ("Language 'de'/'abc' : ", $found-de-abc," and >language 'en'/'abc' : ", $found-en-abc, " and language 'de'/'def' : ", >$found-de-def," and language 'en'/'def' : ", $found-en-def) > >(: Run 5 returns: >Language 'de'/'abc' : 2 and language 'en'/'abc' : 0 and language >'de'/'def' : 2 and language 'en'/'def' : 0 >:) > > >Thanks, > >Johan de Boer >_______________________________________________ >General mailing list >[email protected] >Manage your subscription at: >http://developer.marklogic.com/mailman/listinfo/general _______________________________________________ General mailing list [email protected] Manage your subscription at: http://developer.marklogic.com/mailman/listinfo/general
