- From: RICAUD-DUSSARGET Matthieu <matthieu.ricaud@igs-cp.fr>
- Date: Mon, 16 Dec 2013 18:17:39 +0100
- To: Jostein Austvik Jacobsen <josteinaj@gmail.com>
- Cc: "Imsieke, Gerrit, le-tex" <gerrit.imsieke@le-tex.de>, XProc Dev <xproc-dev@w3.org>
- Message-ID: <CADRkOwFLQwDE6Xve42EUT+4WwWatAnGALxeOem_XvvyV-wzTfg@mail.gmail.com>
Thank you Jostein for your testing ! You're right, when I give an inline (irrelevant) xml content for the $href option, the base-uri mecanism is applied, it sounds good, I think I start to understand ! My interpretation is as follow : Xproc is about stream of XML within pipelines. XML can either flow through an input or output port. Feeding this ports can be done : - either by loading an external document with <p:document> - or by the writing it directly in the pipelin with <p:inline>. That means the xproc processor should care of xml:base only for <p:document> and <p:inline>, this is hard coded and user can't change this ! (?) So I will never be able to define a custom step with an $href option which works like document/@href ! That's all, and it has nothing to do with the implementation (calabash or other). Is it correct ? Then, for my problem I can do : <p:import href="common.xpl"/> <p:pipeline type="igs:xml2ecf" xml:base="file:///C:/foo/bar/"> <igs:xslt href="xsl/my.xsl"> <p:with-option name="base-uri" select="base-uri()"><p:inline><irrelevant/></p:inline></p:with-option> </igs:xslt> </p:pipeline> common.xpl : <p:declare-step type="igs:xslt" name="current"> <p:option name="href" required="true" /> <!-- cx:type="xsd:anyURI" is useless --> <p:option name="base-uri" select="base-uri()"/> <p:load name="load_stylesheet"> <p:with-option name="href" select="resolve-uri($href,$base-uri)"/> </p:load> <p:xslt>...</p:xslt> </p:declare-step> But this is still a bit verbose to pass the base-uri for each xslt. My goal is to make the first file (call "profile.xpl") as simple as possible (see "the context" at http://markmail.org/thread/ih72ahgckiuejb4o). For example : <p:import href="common.xpl"/> <p:pipeline type="igs:xml2ecf" xml:base="file:///D:/res/common/xsl/"> <igs:xslt href="xsl/step1.xsl"/> <igs:xslt href="xsl/step2.xsl"/> <igs:xslt href="xsl/step3.xsl" xml:base="file:///C:/local/res/xsl"/> <igs:xslt href="xsl/step4.xsl"/> <igs:xslt href="xsl/step5.xsl" xml:base=" http://www.igs-cp.fr/net/res/xsl"/> </p:pipeline> As you see there is not only one xml:base to care, the user define the most usefull xml:base for his resssources and then can make exception when necessary. I would have like the file to keep so simple as this sample but I guess this will be difficult. Continuing investigation. Thanks for your help. Regards, Matthieu 2013/12/16 Jostein Austvik Jacobsen <josteinaj@gmail.com> > 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 >>> >> >> > -- Matthieu Ricaud-Dussarget IGS-CP - Développeur XML 05 45 37 09 49
Received on Monday, 16 December 2013 17:18:38 UTC