Hi Carles,

> But I thought that thanks to:
> https://salsa.debian.org/xml-sgml-team/libxslt/-/blob/master/debian/patches/0002-Make-generate-id-deterministic.patch?ref_type=heads

I would have thought that, too. :)  But it could simply be that this
patch doesn't work as intended, or it doesn't cater for this
particular case. I mean, just by glancing at:

    tctxt = xsltXPathGetTransformContext(ctxt);
    if (tctxt == NULL) {
      val = (long)((char *)cur - (char *)&base_address);
    } else {
      tctxt->nextid++;
      val = tctxt->nextid;
      cur->content = (void *) (val);
    }

… we can see that if there is no "transform context", then we will
revert to a nondeterministic identifier.

I think that the generate-id() function is *basically* working:

    $ cat test.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <test/>

    $ cat test.xsl
    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
    <xsl:template match="/">
    <xsl:for-each select="test">   
    <test id="{generate-id(.)}"/>
    </xsl:for-each>
    </xsl:template>
    </xsl:stylesheet>

    $ xsltproc test.xsl test.xml
    <?xml version="1.0"?>
    <test id="idm1"/>

… but when it is called outside of a for-each loop, then it falls back
to a nondeterministic identifier:

    $ cat test2.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <test/>

    $ cat test2.xsl
    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
    <xsl:template match="/">
    <test id="{generate-id(.)}"/>
    </xsl:template>
    </xsl:stylesheet>

    $ xsltproc test2.xsl test.xml
    <?xml version="1.0"?>
    <test id="idm45824385479600"/>
                 ^^^^^^^^^^^^^^

This happens in the debian-history package first via:

    
https://sources.debian.org/src/docbook-xsl/1.79.2%2Bdfsg-7/docbook-xsl/epub/docbook.xsl/#L327

… which calls out to this XSL template, still within docbook-xsl:

   
https://sources.debian.org/src/docbook-xsl/1.79.2%2Bdfsg-7/docbook-xsl/epub/docbook.xsl/#L240-L300

As these are "dc:identifier" heads, there is no forloop, hence no
"transform context" (which I think we can infer includes at least for
loops).

I'm not sure whether this is fundamentally an issue with docbook-xsl
or xlstproc. Should xlstproc generate a nondeterministic identifier
anyway, or should docbook-xsl do something different to ensure
xlstproc's xsltGenerateIdFunction(...) has enough context to generate
one?

Oh, one solution for your package might be to specify a phony ISBN,
DOI or "biblioid" etc:

    
https://sources.debian.org/src/docbook-xsl/1.79.2%2Bdfsg-7/docbook-xsl/epub/docbook.xsl/#L244-L279

Looking at the code, I think this will mean that it will avoid calling
generate-id...?

(This was much more XSLT than I was expecting to look at this Monday
morning.)


Best wishes,

-- 
      ,''`.
     : :'  :     Chris Lamb
     `. `'`      la...@debian.org 🍥 chris-lamb.co.uk
       `-

_______________________________________________
Reproducible-builds mailing list
Reproducible-builds@alioth-lists.debian.net
https://alioth-lists.debian.net/cgi-bin/mailman/listinfo/reproducible-builds

Reply via email to