Re: own defined step and xml:base "inheritance"

Yes, it's probably better to use "/*" than ".". Also, I just remembered
that the select expression uses the primary input document as context
(doh!), I should've tested it before replying the first time.

Try this pipeline:


<?xml version="1.0" encoding="UTF-8"?>
<p:declare-step xmlns:p="http://www.w3.org/ns/xproc" xmlns:c="
http://www.w3.org/ns/xproc-step" version="1.0" xml:base="
http://example.net/script.xpl">

    <p:input port="source">
        <p:inline xml:base="file:/tmp/some-input-document.xml">
            <c:result/>
        </p:inline>
    </p:input>
    <p:output port="result"/>

    <!-- the default context for the select attribute is the primary input
document -->
    <p:add-attribute match="/*"
attribute-name="base-uri-from-primary-input">
        <p:with-option name="attribute-value" select="base-uri(/*)"/>
    </p:add-attribute>

    <!-- inline documents defaults to the same base URI as the current
XProc document -->
    <p:add-attribute match="/*"
attribute-name="base-uri-from-inline-document">
        <p:with-option name="attribute-value" select="base-uri(/*)">
            <p:inline>
                <irrelevant/>
            </p:inline>
        </p:with-option>
    </p:add-attribute>

</p:declare-step>


It will give you this:


<c:result xmlns:c="http://www.w3.org/ns/xproc-step"
base-uri-from-primary-input="file:/tmp/some-input-document.xml"
base-uri-from-inline-document="http://example.net/script.xpl"/>


Note how you need to provide a inline document to be able to access the
base URI of the xproc document. You will often need to refer to the xproc
documents base URI several times, so it might be a good idea to store it in
a variable at the beginning of the pipeline like this:


<?xml version="1.0" encoding="UTF-8"?>
<p:declare-step xmlns:p="http://www.w3.org/ns/xproc" xmlns:c="
http://www.w3.org/ns/xproc-step" version="1.0" xml:base="
http://example.net/script.xpl">

    <p:input port="source">
        <p:inline xml:base="file:/tmp/some-input-document.xml">
            <c:result/>
        </p:inline>
    </p:input>
    <p:output port="result"/>

    <p:variable name="base-uri" select="base-uri(/*)">
        <p:inline>
            <irrelevant/>
        </p:inline>
    </p:variable>

    <!-- use the variable to pass the xml:base to the step (replace
p:add-attribute with your own step) -->
    <p:add-attribute match="/*" attribute-name="base-uri-from-variable">
        <p:with-option name="attribute-value" select="$base-uri"/>
    </p:add-attribute>

</p:declare-step>


Which gives you this:


<c:result xmlns:c="http://www.w3.org/ns/xproc-step" base-uri-from-variable="
http://example.net/script.xpl"/>


Jostein


On 16 December 2013 11:52, Imsieke, Gerrit, le-tex <gerrit.imsieke@le-tex.de
> wrote:

> Try base-uri(/*) since the uri will be set by the attribute on the
> top-level element rather than on the document node around that element.
>
>
> On 16.12.2013 11:05, RICAUD-DUSSARGET Matthieu wrote:
>
>> Hi Jostein,
>>
>> Thanks for your answer.
>>
>> I tried both of your solutions but unfortunately the value of base-uri()
>> is always the *base-uri of the xml file being processed* and not what I
>> wrote in the xml:base attribute :-(
>>
>> On the other hand my goal is actually to make the pipeline as simple and
>> as short as possible : I would really like to use it <igs:xslt
>> href="..."> exactly like <p:document href="..."/> which automaticaly
>> resolve the uri according to the xml:base without I need to tell it.
>>
>> This is important because the first xpl file will be used as a kind of
>> "profile file" for non xproc developpers, it really has to keep less
>> verbose as possible.
>>
>> Anyway you are right about xml:base, this is not "inheritance" (I wrote
>> it with quotes on this purpose), it's rather "implementation of xml:base
>> with declared steps".
>>
>> Thanks for your help.
>>
>> Cheers
>>
>> Matthieu
>>
>> PS : INFO
>> XML Calabash version 1.0.3 (for Saxon 9.4.x), an XProc processor.
>> Running on Saxon version 9.4.0.2, HE edition.
>> I'm not able to run my pipeline with Calabash1.0.16 because of another
>> problem I will explain in another post.
>>
>>
>>
>>
>>
>>
>> 2013/12/16 Jostein Austvik Jacobsen <josteinaj@gmail.com
>> <mailto:josteinaj@gmail.com>>
>>
>>
>>     You could resolve the URI each time you invoke your step:
>>
>>     <p:import href="common.xpl"/>
>>     <p:pipeline type="igs:xml2ecf" xml:base="file:///C:/foo/bar/">
>>          <igs:xslt>
>>              <p:with-option name="href"
>>     select="resolve-uri('xsl/igs/v2.5/main_igs_v2.5.xsl', base-uri(.))"/>
>>          </igs:xslt>
>>     </p:pipeline>
>>
>>     Alternatively, you could add a base-uri option to your step:
>>
>>     <p:import href="common.xpl"/>
>>     <p:pipeline type="igs:xml2ecf" xml:base="file:///C:/foo/bar/">
>>          <igs:xslt href="xsl/igs/v2.5/main_igs_v2.5.xsl">
>>              <p:with-option name="base-uri" select="base-uri(.)"/>
>>          </igs:xslt>
>>     </p:pipeline>
>>
>>     The base URI of p:with-option in your last example is (almost
>>     certainly) an absolute file URI pointing to the file you declared
>>     igs:xslt in. The xml:base is not "inherited" in any way, and there's
>>     no "tunneling" mechanism that could be used like there is in XSLT
>>     (although I wish there were).
>>
>>     Hope this helps.
>>
>>
>>     Jostein
>>
>>
>>     On 16 December 2013 09:50, RICAUD-DUSSARGET Matthieu
>>     <matthieu.ricaud@igs-cp.fr <mailto:matthieu.ricaud@igs-cp.fr>> wrote:
>>
>>         Hi all,
>>
>>         I'm using Calabash. I don't know if the problem comes from xproc
>>         implementation or just xproc dev.
>>
>>         When I use a pipeline with an xml:base attribute, I can use
>>         p:xslt with p:document/@href relative to this xml:base :
>>
>>            <p:pipeline type="igs:xml2ecf" xml:base="file:///C:/foo/bar/">
>>                <p:xslt>
>>                  <p:input port="stylesheet"><p:document
>>         href="xsl/my.xsl"/></p:input>
>>                </p:xslt>
>>            </p:pipeline>
>>
>>         As long as file:///C:/foo/bar/xsl/my.xsl exists, it works,
>> perfect !
>>
>>         But when I want to override p:xslt with my own step in a
>>         library, it doesn't work anymore :
>>
>>            <p:import href="common.xpl"/>
>>            <p:pipeline type="igs:xml2ecf" xml:base="file:///C:/foo/bar/">
>>                <igs:xslt href="xsl/igs/v2.5/main_igs_v2.5.xsl"/>
>>            </p:pipeline>
>>
>>         where common.xpl defines :
>>         _
>>
>>         _
>>         <p:declare-step type="igs:xslt" name="current">
>>              <p:input port="source" sequence="true" primary="true"/>
>>              <p:input port="parameters" kind="parameter"/>
>>              <p:output port="result" primary="true"/>
>>              <p:option name="href" required="true" cx:type="xsd:anyURI"/>
>>              <p:load name="load_stylesheet"><p:with-option name="href"
>>         select="$href"/></p:load>
>>              <p:xslt>
>>                  <p:input port="stylesheet">
>>                      <p:pipe port="result" step="load_stylesheet"/>
>>                  </p:input>
>>                  <p:input port="source">
>>                      <p:pipe port="source" step="current"/>
>>                  </p:input>
>>                  <p:input port="parameters">
>>                      <p:pipe port="parameters" step="current"/>
>>                  </p:input>
>>              </p:xslt>
>>              <ut:log>
>>                <p:with-option name="href"
>>         select="resolve-uri($debug_fileName, base-uri(.))"/>
>>              </ut:log>
>>            </p:declare-step>
>>
>>         I have added cx:type="xsd:anyURI" on href option so it is affect
>>         by xml:base but it doesn't work either.
>>
>>         I get an error because the xsl file is not available in the same
>>         folder as the xpl file.
>>
>>         Of course I can add the xml:base on "igs:xslt" p:declare-step
>>         and it works. But this step is a common one and the goal is to
>>         be able to call it with a different xml:base each time.
>>
>>         Do you have any advices or ideas to solve this ?
>>
>>         Thanks in advance,
>>
>>         Matthieu
>>
>>
>>         --
>>         Matthieu Ricaud-Dussarget
>>         IGS-CP - Développeur XML
>>         05 45 37 09 49
>>
>>
>>
>>
>>
>> --
>> Matthieu Ricaud-Dussarget
>> IGS-CP - Développeur XML
>> 05 45 37 09 49
>>
>
>

Received on Monday, 16 December 2013 11:33:25 UTC