Am avut mai multe incercari de-a lungul timpului sa editez documente folosind DocBook dar de fiecare data am ramas cu impresia ca este o metoda buna de “authoring” dar dificil de folosit. Cred ca documentatia in acest domeniu este foarte buna deorece este scrisa de oameni cu inclinare dar si care cunosc conceptele. Cu toate acestea este dificil pentru un incepator sa fie atras de aceasta modalitate de authoring pentru ca instalarea este relativ complicata, sunt multe versiuni, documentatia vasta. Si uneori mai apar si probleme de ordin tehnic!
Zilele acestea m-am confruntat din nou cu problema rezolvarii resurselor publice. Am inceput prin a scrie un articol folosind DocBook. XML-ul rezultat avea ca preambul urmatoarele:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML 5.0//EN" "http://docbook.org/xml/5.0/dtd/docbook.dtd">
iar XSLT-ul folosit pentru generarea codului HTML incepea asa:
<?xml version="1.0" encoding="ASCII"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
<xsl:import href="http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl"/>
Dupa cum se vede cel putin urmatoarele resurse web trebuiesc rezolvate:
http://docbook.org/xml/5.0/dtd/docbook.dtd
http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl
Sigur, acest lucru se poate face simplu prin accesarea din Internet a acestor resurse. Atunci cand nu avem Internet sau dorim ca acest lucru sa se intample rapid este indicat ca aceste resurse sa fie disponibile local iar rezolvarea lor sa se faca local. Exista Entity Resolution care defineste un format XML pentru asocierea resurselor referite la alte resurse (inclusiv resurse locale). Aceste fisiere XML sunt numite “catalog” care permit gestiunea a doua tipuri de asocieri:
- asociaza o entitate externa la URI-ul unei resurse;
- asociaza URI-ul unei resurse la un alt URI;
Exemplu de fisier catlog:
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog" prefer="public">
<public publicId="-//OASIS//DTD DocBook XML 5.0//EN" uri="dtd/docbook.dtd"/>
<system systemId="http://docbook.org/xml/5.0/dtd/docbook.dtd" uri="dtd/docbook.dtd"/>
</catalog>
Pentru Java exista biblioteca Resolver care permite rezolvarea resurselor. Mai jos doua exemple:
java org.apache.xml.resolver.apps.resolver -d 99 -c d:/authoring/docbook-5.0/catalog.xml -p "-//OASIS//DTD DocBook XML 5.0//EN" public
Resolve PUBLIC (publicid, systemid):
public id: -//OASIS//DTD DocBook XML 5.0//EN
Result: file:d:/authoring/docbook-5.0/dtd/docbook.dtd
java org.apache.xml.resolver.apps.resolver -d 99 -c d:/authoring/docbook-5.0/catalog.xml -s "http://docbook.org/xml/5.0/dtd/docbook.dtd" system
Resolve SYSTEM (systemid):
system id: http://docbook.org/xml/5.0/dtd/docbook.dtd
Result: file:d:/authoring/docbook-5.0/dtd/docbook.dtd
Problema a inceput atunci cand am incercat sa folosesc aceasta biblioteca din ant. Exista elementul xmlcatalog care permite definirea unui catalog nou sau referirea unuia existent. Cand se refera un catalog extern este nevoie ca biblioteca resolver sa fie disponibila.
Acest lucru este documentat:
In addition, external catalog files may be specified in a nested catalogpath, but they will be ignored unless the resolver library from xml-commons is available in the system classpath.
Deci important este ca resolver.jar sa fie in system classpath altfel obtinem o notificare de genul:
Warning: XML resolver not found; external catalogs will be ignored
Inchei cu urarea May All Your Names Resolve Successfully!