Name

p:add-xml-base — The standard p:add-xml-base step.

Synopsis

The p:add-xml-base step exposes the base URI via explicit xml:base attributes. The input document from the source port is replicated to the result port with xml:base attributes added to or corrected on each element as specified by the options on this step.

Input portPrimarySequenceContent types
source✔  xml html 
Output portPrimarySequenceContent types
result✔  xml html 
Option nameTypeDefault value
allxs:booleanfalse()
relativexs:booleantrue()
Declaration
1 |<p:declare-step xmlns:p="http://www.w3.org/ns/xproc" type="p:add-xml-base">
  |   <p:input port="source" content-types="xml html"/>
  |   <p:output port="result" content-types="xml html"/>
  |   <p:option name="all" as="xs:boolean" select="false()"/>
5 |   <p:option name="relative" as="xs:boolean" select="true()"/>
  |</p:declare-step>
Errors
CodeDescription
err:XC0058It is a dynamic error (err:XC0058) if the all and relative options are both true.

Description

The p:add-xml-base step is a standard XProc 3.0 step. It is also described on XProcRef.org.

Examples

The following pipeline constructs a document with a base URI of file:///path/to/examples/. The resulting document is inserted into a wrapper, once just as it was constructed, and once after running it through p:add-xml-base.

With the wrapper, the base URI of the example element is preserved in both cases. If you resolved a URI against the base URI of either element, it would be resolved against file:///path/to/examples/.

 1 |<p:declare-step xmlns:p="http://www.w3.org/ns/xproc"
   |                version="3.0">
   | 
   |  <p:output port="result"/>
 5 | 
   |  <p:identity name="example">
   |    <p:with-input>
   |      <p:inline document-properties="map {
   |                  'base-uri': 'file:///path/to/examples/' }">
10 |        <example/>
   |      </p:inline>
   |    </p:with-input>
   |  </p:identity>
   | 
15 |  <p:add-xml-base name="fixup"/>
   | 
   |  <p:insert position="first-child" match="/wrapper/without-fixup">
   |    <p:with-input port="source">
   |      <wrapper xml:base="http://example.com/">
20 |        <without-fixup/>
   |        <with-add-xml-base/>
   |      </wrapper>
   |    </p:with-input>
   |    <p:with-input port="insertion" pipe="@example"/>
25 |  </p:insert>
   | 
   |  <p:insert position="first-child" match="/wrapper/with-add-xml-base">
   |    <p:with-input port="insertion" pipe="@fixup"/>
   |  </p:insert>
30 |</p:declare-step>

However, in the serialized the result, the base URI of the first example isn’t preserved. XML serialization does nothing to preserve base URIs.

  |<wrapper xml:base="http://example.com/">
  |        <without-fixup><example/></without-fixup>
  |        <with-add-xml-base><example xml:base="file:///path/to/examples/"/></with-add-xml-base>
  |      </wrapper>

The p:add-xml-base step makes each element’s base URI explicit using XML Base. Consequently, the base URI of the second example has been recorded in an explicit xml:base attribute.

If the serialized document is re-parsed, the base URI of the second example will still be correct, while the base URI of the first has been lost.

Note

Adding xml:base attributes to your document may have other consequences, for example in validation. The xml:base attribute is an attribute like any other, it must be declared in your schema and it will be visible to other processes.

Additional examples

The XProc test suite contains examples of the p:add-xml-base step.