XSLT est généralement le mécanisme principal de conversion de documents XML. Cependant, vers 2009, Anakia utilisant Apache (Jakarta) Velocity comme moteur de modèle a suscité beaucoup d'enthousiasme, et moi-même (récemment mis à jour). Je l'utilise pour bloguer (pas).
Velocity lui-même est encore en cours de développement et est connu comme le moteur de modèle pour les applications Web Java. Malheureusement, anakia n'a pas été développé et n'est pas inclus dans la dernière version de Velocity Engine 2.0. Un mécanisme basé sur un schéma prédéfini tel que DocBook est utilisé, mais un mécanisme qui convertit n'importe quel format XML propre, non limité à Anakia, n'est pas couramment utilisé, et un mécanisme tel que le démarquage devient répandu. Je pense que tu le fais.
Puisque XSLT est un tuuring complet et a un goût prononcé pour un langage fonctionnel, il a été complété en décrivant le traitement récursif et en suivant la syntaxe XML, la quantité de description est plus grande que celle d'un langage de programmation général par la quantité de balises. D'autre part, certains éléments sont plus gênants que faciles à utiliser.
XSLT et XSL-FO sont d'excellentes technologies, mais je pense aussi que le préjugé selon lequel elles doivent être utilisées limite l'utilisation de XML.
Récemment, j'ai personnellement commencé à écrire des articles avec Markdown (md) et Asciidoc (adoc) avec Hugo comme back-end pour la création de sites Web statiques, mais md Bien que le format et adoc soit simple, j'ai personnellement les plaintes suivantes.
Étant donné que l'objectif est différent en premier lieu, il est déraisonnable que nous ne puissions pas faire ce que nous avons réalisé avec XML, mais lors de la rédaction de documents techniques, les personnes qui souhaitent décrire l'entrée au clavier et la sortie d'écran plus clairement et séparément Je le sens.
Le format adoc est pratique à cet égard car il peut recevoir n'importe quel attribut de classe ou id. Si vous unifiez le style d'écriture, vous pourrez l'absorber avec CSS. Cependant, je pense qu'on ne sait toujours pas s'il est facile à lire ou si les fonctions intégrées uniques sont vraiment pratiques, mais il est nécessaire de fonctionner avec une forte conscience de la sortie de l'écran plutôt que du contexte pur. Je vais le sentir.
En outre, le format adoc semble difficile à forcer les autres à utiliser. C'est bien meilleur que le format roff, mais même si c'est une option pour moi, si je veux unifier le format avec un nombre non spécifié de personnes, je pense que la fonction de vérification est médiocre ou difficile à utiliser.
Par conséquent, j'ai essayé de placer le fichier HTML produit par Anakia dans une partie du contenu / de la hiérarchie d'Hugo. De plus, le schéma est défini par Relax-NG et vérifié par Jing.
Markdown est suffisant, et je pense qu'il y a des gens qui pensent que c'est simple, c'est mieux. Personnellement, j'ai un sentiment proche de la conviction que le traitement des données de document et la représentation de sortie doivent être séparés, donc je pense que le principe XML (like) est également très influent.
Ceci est l'introduction, et je voulais utiliser le document écrit au format XML original créé par anakia dans le passé, j'ai donc résumé les problèmes que je ressentais en ce moment.
Les fichiers téléchargés se trouvent dans ~ / Downloads /. De plus, chaque commande est exécutée à chaque fois depuis le répertoire de travail supérieur. J'exécute des commandes comme `` $ cd tools '' à plusieurs reprises, mais sachez que vous pouvez les ignorer si vous les avez déjà déplacées.
Il y a un lien vers anakia-1.0 au bas de la page de téléchargement du site officiel de Velocity, mais je ne l'utilise pas.
Comme cela sera décrit plus tard, obtenez velocity-1.7 sur la page de publication du site officiel, et anakia Nous utiliserons la vitesse 1.7 au lieu de -1.0. Je pense que le seul changement est le nom du package d'AnakiaTask, donc si vous faites référence à la documentation anakia-1.0, vous devez être prudent lors de la création d'une tâche fourmi.
$ mkdir tools
$ cd tools
$ tar xvzf ~/Downloads/velocity-1.7.tar.gz
$ ln -s velocity-1.7 velocity
Puisque RelaxNG et Jing sont utilisés pour vérifier le fichier XML, nous déploierons également des outils pour cela.
Site Web officiel de Jing existe sur relaxng.org, mais le code source est distribué sur Github ([relaxng / jing-trang](https :: Allez sur //github.com/relaxng/jing-trang)).
Le fichier JAR requis pour l'exécution est téléchargé à partir de la page de téléchargement du site officiel pour 20091111.
$ cd tools ##Déplacer dans le même répertoire que anakia
$ unzip ~/Downloads/jing-20091111.zip
$ ln -s jing-20091111 jing
Puisque anakia commence comme une tâche de fourmi, obtenez la dernière version de la série 1.9 à partir du site de téléchargement.
$ cd tools ## anakia、jing,Déplacer vers le même répertoire que trnag
$ tar xvzf ~/Downloads/apache-ant-1.9.13-bin.tar.gz
$ ln -s apache-ant-1.9.13 apache-ant
Jusqu'à présent, le répertoire des outils ressemble à ceci:
$ ls -F
apache-ant@ apache-ant-1.9.13/ jing@ jing-20091111/ velocity@ velocity-1.7/
Préparez le répertoire bin en parallèle avec le répertoire tools et préparez-vous à exécuter la commande.
$ mkdir bin ##Créez-le au même emplacement que le répertoire des outils.
Tout d'abord, préparez le fichier bin / envrc.
bin/envrc
## Please change the following line for your correct JDK location.
JAVA_HOME=/opt/jdk1.8.0_191
export JAVA_HOME
WD="$(pwd)"
SCRIPTFILE="$(readlink -f $0)"
BASEDIR="$(dirname $SCRIPTFILE)"
TOPDIR="${BASEDIR}/.."
export WD SCRIPTFILE BASEDIR TOPDIR
TOOLDIR="${TOPDIR}/tools"
ANT_HOME=${TOOLDIR}/apache-ant
VELOCITY_HOME=${TOOLDIR}/velocity
JING_HOME=${TOOLDIR}/jing
export ANT_HOME VELOCITY_HOME JING_HOME
export PATH=${ANT_HOME}/bin:${PATH}
CP_ANT=$(find ${ANT_HOME}/. -name '*.jar' | tr '\n' ':')
CP_VELOCITY=$(find ${VELOCITY_HOME}/. -name '*.jar' | tr '\n' ':')
CP_JING=$(find ${JING_HOME}/. -name '*.jar' | tr '\n' ':')
export CLASSPATH=${CLASSPATH}:${CP_VELOCITY}:${CP_ANT}:${CP_JING}
Cette fois, nous préparons un fichier xml qui décrit la tâche fourmi dans bin.
bin/run-anakia.xml
<project name="build-site" default="doc" basedir=".">
<property environment="env" />
<!-- Please change the following property variables -->
<property name="docs.infilepattern" value="20*.xml" />
<property name="docs.basedir" value="${env.WD}" />
<property name="docs.destdir" value="${env.WD}" />
<property name="docs.vslfilename" value="blog.vsl"/>
<property name="docs.projfilename" value="project.xml"/>
<property name="docs.propfilepath" value="${env.BASEDIR}/velocity.properties"/>
<taskdef name="jing" classname="com.thaiopensource.relaxng.util.JingTask"/>
<target name="validate_relaxng">
<jing rngfile="${docs.basedir}/blog.rng">
<fileset dir="${docs.basedir}" includes="${docs.infilepattern}"/>
</jing>
</target>
<target name="doc" depends="validate_relaxng">
<taskdef name="anakia"
classname="org.apache.velocity.anakia.AnakiaTask"/>
<anakia basedir="${docs.basedir}"
includes="${docs.infilepattern}"
destdir="${docs.destdir}"
extension=".html"
style="${docs.vslfilename}"
projectFile="${docs.projfilename}"
velocityPropertiesFile="${docs.propfilepath}"
lastModifiedCheck="true" >
</anakia>
</target>
</project>
Préparez bin / run-anakia.sh en tant que script wrapper pour effectuer ces opérations.
bin/run-anakia.sh
#!/bin/bash
SCRIPTFILE="$(readlink -f $0)"
BASEDIR="$(dirname $SCRIPTFILE)"
. "${BASEDIR}/envrc"
## main ##
ant -f ${BASEDIR}/run-anakia.xml "$@"
Lorsque ce script est exécuté, Jing effectuera la validation et la génération du fichier HTML en même temps, mais il est également possible d'exécuter uniquement la tâche de validation comme `` $ bin / run-anakia.sh validate_relaxng ''.
Ensuite, préparez velocity.properties. La langue par défaut est le latin-1 (ISO-8859-1), elle est donc obligatoire.
bin/velocity.properties
input.encoding=UTF-8
output.encoding=UTF-8
Enfin, les fichiers suivants sont préparés.
$ cd bin
$ ls
envrc run-anakia.sh run-anakia.xml velocity.properties
Allez ensuite dans le répertoire cible et préparez les trois fichiers.
Le premier project.xml est presque vide car je ne l'ai pas utilisé en particulier.
${target_dir}/project.xml
<?xml version="1.0" encoding="UTF-8"?>
<project name="Anakia"
href="http://velocity.apache.org/anakia">
</project>
Comme le schéma RelaxNG et le modèle VSL utilisés sont longs, le modèle VSL et le fichier XML de l'article sont mis en correspondance avec le fichier RNG extrait de OASIS Tutorial. Est affiché comme un échantillon.
${target_dir}/blog.vsl
<html>
#set($cards = $xpath.applyTo("/card", $root))
#foreach($card in $cards)
<ul>
#foreach($c in $card.getContent())
#if($c.name == "name")
<li>Name: $c.getValue()</li>
#elseif($c.name == "email")
<li>EMail: $c.getValue()</li>
#end
#end
</ul>
#end
</html>
${target_dir}/blog.rng
<?xml version="1.0" encoding="UTF-8" ?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0">
<start>
<element name="addressBook">
<zeroOrMore>
<element name="card">
<ref name="cardContent"/>
</element>
</zeroOrMore>
</element>
</start>
<define name="cardContent">
<element name="name">
<text/>
</element>
<element name="email">
<text/>
</element>
</define>
</grammar>
Après avoir placé le fichier de configuration, placez le document approprié dans le même répertoire.
${target_dir}/20190114.xml
<addressBook>
<card>
<name>John Smith</name>
<email>[email protected]</email>
</card>
<card>
<name>Fred Bloggs</name>
<email>[email protected]</email>
</card>
</addressBook>
Si vous lancez le script dans ce répertoire, vous obtiendrez les résultats suivants:
$ cd ${target_dir}
$ ls -F
20190114.xml blog.rng* blog.vsl project.xml velocity.log
$ ../bin/run-anakia.sh
...
$ cat 20190114.html
<html>
<ul>
<li>Name: John Smith</li>
<li>EMail: [email protected]</li>
</ul>
<ul>
<li>Name: Fred Bloggs</li>
<li>EMail: [email protected]</li>
</ul>
</html>
Puisque Hugo lui-même n'a pas de mécanisme pour ajouter son propre préprocesseur, il est nécessaire de sortir un fichier HTML sous content / comme prétraitement séparément de l'exécution hugo.
Par conséquent, placez le fichier source écrit au format XML dans un répertoire qui n'est pas sous le contrôle d'Hugo et utilisez Anakia Task pour générer le fichier HTML vers n'importe quel emplacement sous le contenu.
Puisqu'il est nécessaire d'ajouter Front Matter lorsque le fichier HTML est placé, il est préférable d'ajouter Title dans le fichier VSL. Je pense que ce sera.
Velocity lui-même n'a pas un bon moyen de connaître l'heure de mise à jour d'un fichier, donc pour ajouter une date à Front Matter, spécifiez un fichier XML avec le nom du fichier, etc. et la chaîne de caractères de la date de création du fichier comme CustomContext Il semble qu'une certaine ingéniosité soit nécessaire.
Si vous utilisez l'anakia-1.0 distribué, il peut ne pas fonctionner comme décrit dans la documentation anakia en raison du fichier velocity-1.5.jar inclus.
Le
$ velocityHasNext```, qui est nécessaire pour décrire le traitement à effectuer au début et à la fin de la boucle #foreach dans le fichier modèle VSL, n'est pas implémenté dans velocity-1.5.
Celles-ci sont définies comme valeurs par défaut pour velocity.properties. directive.foreach.counter.name = velocityCount directive.foreach.iterator.name = velocityHasNext
Par exemple, lors de l'écriture de balises au format TOML dans Front Matter d'Hugo, il est nécessaire de les mettre entre parenthèses comme
tags = ["tag1", "tag2"] `` car elles sont écrites au format liste. Il y a.
Si le nom de la balise était à l'origine stocké dans une variable \ $ tags au format liste, vous auriez besoin d'un code comme celui-ci, car il n'y a pas de bon moyen de comparer le résultat de \ $ tags.size () avec \ $ velocityCount. \ $ velocityHasNext est requis.
#foreach ($tag in $tags)
#if ($tags.size() == 1)
tags: [ "$tag.getValue()" ]
#elseif ($velocityCount == 1)
tags: [ "$tag.getValue()"##
#elseif ($velocityHasNext)
, "$tag.getValue()"##
#else
, "$tag.getValue()" ]
#end
#end
De plus, les versions antérieures à velocity-1.7 ont divers problèmes, il n'est donc pas recommandé d'utiliser anakia-1.0, qui dépend de velocity-1.5.
En tant que norme de l'industrie, je pense que la théorie est d'utiliser XSLT, XSL-FO, mais pour le fichier XML au format unique défini par un schéma tel que RelaxNG, créez un document bien formé avec une certaine signification. Je pense que c'est un bon moyen de répondre aux besoins de conversion en HTML, etc.
Personnellement, je n'ai aucune objection à la diffusion de Markdown et d'Asciidoc, mais je ne peux pas penser que c'est bien parce que c'est pratique.
Je pense qu'il est nécessaire d'ajouter une annotation qui peut être un indice en tant que matériel de référence qui est traité par un ordinateur, non limité à l'IA, et même si vous n'utilisez pas RDF ou Ontology, le nom de la balise peut être un indice XML Je pense que le document est bon.
Anakia est plus facile à apprendre et à utiliser que XSLT, je voudrais donc l'utiliser comme un outil à portée de main et le diffuser.
Recommended Posts