Passing document href as an option in XProc

2 min read 05-10-2024
Passing document href as an option in XProc


Passing Document hrefs as Options in XProc: A Practical Guide

XProc, the XML Pipeline Language, is a powerful tool for processing XML documents. It offers a wide range of capabilities, including transformation, validation, and data manipulation. However, sometimes you might need to pass a document's href (the URL pointing to it) as an option to your XProc pipeline. This can be a bit tricky, as XProc typically operates on documents, not their URLs.

This article delves into the intricacies of passing document hrefs as options in XProc, providing practical solutions and insights to enhance your pipeline development.

Scenario and Initial Code

Imagine you have a pipeline that generates an HTML report from an XML data file. You want to make this pipeline flexible by allowing the user to specify the XML source file's location via an option.

Here's a basic example of how you might try to achieve this:

<p:pipeline xmlns:p="http://www.w3.org/ns/xproc" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <p:input port="source" required="true" />
  <p:option name="source-href" required="true"/>
  <p:declare-step name="load-source"  >
    <p:input port="source"  />
    <p:option name="href" select="$source-href"  />
    <p:output port="result" />
    <p:xslt>
      <p:input port="source"  />
      <p:option name="href" select="$href"  />
      <p:output port="result" />
    </p:xslt>
  </p:declare-step>
  <p:output port="result"  />
</p:pipeline>

In this code, the source-href option is supposed to receive the XML file's href. However, this approach will likely fail because XProc expects the href option to be passed as a URL, not a document itself.

The Solution: Utilizing Base URIs

The key to resolving this issue lies in understanding how XProc handles base URIs. By setting the base URI correctly, you can effectively link document references to the provided href:

<p:pipeline xmlns:p="http://www.w3.org/ns/xproc" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <p:input port="source" required="true" />
  <p:option name="source-href" required="true" />
  <p:declare-step name="load-source" >
    <p:input port="source" />
    <p:output port="result" />
    <p:xslt>
      <p:input port="source" />
      <p:option name="base-uri" select="$source-href"  /> 
      <p:output port="result" />
    </p:xslt>
  </p:declare-step>
  <p:output port="result" />
</p:pipeline>

In this modified pipeline, we use the base-uri option within the XSLT step. When the XSLT processor encounters relative references within the XML document, it will resolve them relative to the specified base URI, which is the value of the source-href option.

Additional Considerations

  • Data Types: Be mindful of the data types of the options. The href option should typically be a string, but you might need to convert it if it's received as a different data type.
  • External Libraries: Some XProc processors might require specific external libraries or configurations to handle URLs properly. Consult the documentation of your XProc processor for detailed instructions.

Conclusion

Passing document hrefs as options in XProc pipelines might seem challenging initially. However, by understanding how XProc handles base URIs and utilizing the base-uri option within steps like XSLT, you can seamlessly incorporate external documents into your pipelines. Remember to carefully consider data types and potential processor-specific requirements for a smooth and efficient workflow.

By adopting these strategies, you can extend the flexibility and power of XProc to handle various use cases involving dynamically-sourced documents.