XInclude i XPointer

Publicat el 01/01/2009

XInclude és la forma que proporciona el W3C per inserir documents XML o text dins de documents XML obtenint un únic infoset. Amb l'ajuda d'XPointer es poden inserir fragments d'un document XML (inclusive ell mateix sempre que no sigui una crida recursiva infinita).

A diferència de les entitats DTD que cal primer definir i després invocar, XInclude permet invocar directament mitjançant l'atribut @href combinable amb l'atribut @xpointer.

A més a més, si una entitat falla en el procés de substitució habitualment resulta en un error fatal. XInclude proporciona un procés de recuperació de l'error mitjançant l'element /xi:fallback el pot contenir un fragment XML o un element /xi:include que faci una crida alternativa a l'element /xi:include inicial. És a dir, donat un XML tal que:


<dml
  xmlns="http://purl.oclc.org/NET/dml/1.0"
  xmlns:xi="http://www.w3.org/2001/XInclude">
  <xi:include href="chapter-1.xml">
    <xi:fallback>
      <p>Contingut alternatiu a la inserció fallida.</p>
    </xi:fallback>
  </xi:include>
</dml>

Si falla la crida a l'arxiu "chapter-1.xml", l'infoset resultant contindrà el paràgraf amb el text, mentre que amb:


<dml
  xmlns="http://purl.oclc.org/NET/dml/1.0"
  xmlns:xi="http://www.w3.org/2001/XInclude">
  <xi:include href="chapter-1.xml">
    <xi:fallback>
      <xi:include href="chapter-fallback-1.xml"/>
    </xi:fallback>
  </xi:include>
</dml>

Si falla la crida a l'arxiu "chapter-1.xml", s'intenta la crida a l'arxiu "chapter-fallback-1.xml" i si aquesta crida falla, com que no té cap element /xi:fallback definit, el resultat és un error fatal.

XPointer és un sistema que permet referenciar un punt concret (més enllà dels nodes) d'un document XML mitjançant la sintaxi d'XPath 1.0 ampliada.

Per poder fer aquestes referencies l'XPointer Framework defineix els esquemes xpointer(), id(), element() i xmlns().

Per exemple, donat un document "chapter-1.xml" tal que:


<dml xmlns="http://purl.oclc.org/NET/dml/1.0">
  <section id="intro">
    <title>Introducció</title>
    <p>Lorem ipsum dolor sit amet</p>
    ( … )
  </section>
  <section id="seccio-1">
    <title>secció 1</title>
    <p>Lorem ipsum dolor sit amet</p>
    ( … )
  </section>
  ( … )
</dml>

Fent una crida des del document inicial tal que:


<dml
  xmlns="http://purl.oclc.org/NET/dml/1.0"
  xmlns:xi="http://www.w3.org/2001/XInclude">
    <title>Document inicial</title>
    <xi:include href="chapter-1.xml" xpointer="xpointer(/dml/section)"/>
</dml>

El resultat és:


<dml
  xmlns="http://purl.oclc.org/NET/dml/1.0"
  xmlns:xi="http://www.w3.org/2001/XInclude">
    <title>Document inicial</title>
  <section id="intro">
    <title>Introducció</title>
    <p>Lorem ipsum dolor sit amet</p>
    ( … )
  </section>
</dml>

Alternativament es pot fer:


<xi:include href="chapter-1.xml" xpointer="id('intro')"/>

<xi:include href="chapter-1.xml" xpointer="element(/1/1)"/>

En síntesi, l'esquema id() permet fer crides a un identificador del document. Si la crida no té alternativa, és simplificable a:


<xi:include href="chapter-1.xml" xpointer="intro"/>

L'esquema element() permet apuntar per posició del node. És una forma simplificada de:


<xi:include href="chapter-1.xml" xpointer="xpointer(/*[1]/*[1])"/>

Una sóla crida XPointer pot contenir més d'una opció a mode d'alternativa en cas de fallar la primera:


<xi:include href="chapter-1.xml" xpointer="id('intro') xpointer(/dml/section[1]) element(/1/1)"/>

D'aquesta manera, si l'identificador "intro" no existeix actua l'esquema xpointer() i si, per exemple, l'element arrel ja no es diu "dml", actua l'esquema element() obtenint el primer element fill de l'element root.

L'esquema xmlns() permet definir espais de noms associats als elements seleccionats.

Els processador més comú amb un bon suport d'XInclude i d'XPointer és xsltproc.

Saxon no suporta XPointer cosa que redueix molt la potència d'XInclude.

N'Erik Wilde va fer XIPr el qual implementa l'esquema element() mitjançant XSLT 2.0.

Això em va donar la idea d'intentar implementar l'esquema xpointer() mitjançant XSLT 2.0. El projecte, XIProc, de moment només implementa els quatre selectors més comuns d'XPath.

Recursos relacionats

Comentaris

Afegir un comentari