[JAVA] Ich habe jetzt versucht, Anakia + Jing zu verwenden

XSLT ist im Allgemeinen der Hauptmechanismus für die Konvertierung von XML-Dokumenten. Um 2009 herum war Anakia, das Apache (Jakarta) Velocity als Vorlagen-Engine verwendete, sehr aufgeregt, und ich selbst (kürzlich aktualisiert). Ich benutze es zum Bloggen (nicht).

Velocity selbst befindet sich noch in der Entwicklung und wird als Template-Engine für Java-basierte Webanwendungen bezeichnet. Leider wurde Anakia nicht entwickelt und ist nicht in der neuesten Version von Velocity Engine 2.0 enthalten. Ein Mechanismus, der auf einem vordefinierten Schema wie DocBook basiert, wird verwendet, aber ein Mechanismus, der ein eigenes XML-Format konvertiert, das nicht auf Anakia beschränkt ist, wird nicht häufig verwendet, und ein Mechanismus wie Markdown ist weit verbreitet. Ich denke du machst es.

Da XSLT eine vollständige Struktur ist und einen starken Geschmack einer funktionalen Sprache hat, wurde es durch die Beschreibung der rekursiven Verarbeitung und die Befolgung der XML-Syntax vervollständigt. Die Anzahl der Beschreibungen ist um die Anzahl der Tags größer als die der allgemeinen Programmiersprachen. Auf der anderen Seite gibt es einige Elemente, die eher problematisch als einfach zu bedienen sind.

XSLT und XSL-FO sind großartige Technologien, aber ich denke auch, dass das Vorurteil, dass sie verwendet werden müssen, die Verwendung von XML einschränkt.

Vor kurzem habe ich persönlich angefangen, Artikel mit Markdown (md) und Asciidoc (adoc) mit Hugo als Backend für die Erstellung statischer Websites zu schreiben, aber md Obwohl das und Adoc-Format einfach ist, habe ich persönlich die folgenden Beschwerden.

Da der Zweck in erster Linie anders ist, ist es unvernünftig, dass wir nicht das tun können, was wir mit XML realisiert haben, sondern beim Schreiben technischer Dokumente Personen, die Tastatureingaben und Bildschirmausgaben klarer und getrennter beschreiben möchten Ich fühle es.

Das Adoc-Format ist in dieser Hinsicht praktisch, da Sie das Klassenattribut und das ID-Attribut beliebig hinzufügen können. Wenn Sie den Schreibstil vereinheitlichen, können Sie ihn mit CSS aufnehmen. Ich denke jedoch, dass es immer noch unbekannt ist, ob es leicht zu lesen ist oder ob die einzigartigen integrierten Funktionen wirklich praktisch sind, aber es ist notwendig, mit einem starken Bewusstsein für die Bildschirmausgabe und nicht mit reinem Kontext zu arbeiten. Ich werde es fühlen.

Außerdem ist es schwierig, das Adoc-Format zur Verwendung durch andere zu zwingen. Es ist viel besser als das Roff-Format, aber selbst wenn es eine Option für mich ist, wenn ich das Format mit einer nicht festgelegten Anzahl von Personen vereinheitlichen möchte, denke ich, dass die Überprüfungsfunktion schlecht oder schwierig zu verwenden ist.

Daher habe ich versucht, die von Anakia ausgegebene HTML-Datei in einen Teil von Hugos Inhalt / Hierarchie zu platzieren. Darüber hinaus wird das Schema von Relax-NG definiert und von Jing überprüft.

Markdown ist genug, und ich denke, es gibt Leute, die denken, dass einfach besser ist. Ich persönlich bin der Überzeugung nahe, dass die Verarbeitung von Dokumentdaten und die Ausgabedarstellung getrennt werden sollten, daher denke ich, dass das XML-Prinzip (like) ebenfalls einen großen Einfluss hat.

Dies ist die Einführung, und ich wollte das Dokument verwenden, das im ursprünglichen XML-Format geschrieben wurde, das in der Vergangenheit von anakia erstellt wurde, und habe daher die Probleme zusammengefasst, die ich im Moment hatte.

Umgebung

Die heruntergeladenen Dateien befinden sich in ~ / Downloads /. Außerdem wird jeder Befehl jedes Mal aus dem obersten Arbeitsverzeichnis ausgeführt. Ich führe Befehle wie "$ cd tools" wiederholt aus, aber beachten Sie, dass Sie sie überspringen können, wenn Sie sie bereits verschoben haben.

Anakia erhalten und einrichten

Es gibt einen Link zu anakia-1.0 am Ende der Official Velocity Site Download Page, aber ich benutze ihn nicht.

Wie später beschrieben wird, erhalten Sie Velocity-1.7 von der Release-Seite der offiziellen Website und von Anakia Wir werden Geschwindigkeit 1.7 anstelle von -1.0 verwenden. Ich denke, die einzige Änderung ist der Paketname von Anakia Task. Wenn Sie sich also auf die Anakia-1.0-Dokumentation beziehen, sollten Sie beim Erstellen einer Ant-Task vorsichtig sein.

$ mkdir tools
$ cd tools
$ tar xvzf ~/Downloads/velocity-1.7.tar.gz
$ ln -s velocity-1.7 velocity

Andere Werkzeuge als Anakia

Da RelaxNG und Jing zum Überprüfen der XML-Datei verwendet werden, werden wir auch Tools dafür bereitstellen.

Jings offizielle Website existiert auf relaxng.org, aber der Quellcode wird bei Github ([relaxng / jing-trang](https ::) verteilt. Gehen Sie zu //github.com/relaxng/jing-trang)).

Die für die Ausführung erforderliche JAR-Datei wird 20091111 von der Official Site Download Page heruntergeladen.

$ cd tools   ##Wechseln Sie in dasselbe Verzeichnis wie anakia
$ unzip ~/Downloads/jing-20091111.zip
$ ln -s jing-20091111 jing

Da Anakia als Aufgabe von Ant beginnt, erhalten Sie die neueste Version der Serie 1.9 (von der Download-Site) (https://ant.apache.org/bindownload.cgi).

$ cd tools  ## anakia、jing,Wechseln Sie in dasselbe Verzeichnis wie trnag
$ tar xvzf ~/Downloads/apache-ant-1.9.13-bin.tar.gz 
$ ln -s apache-ant-1.9.13 apache-ant

Bisher sieht das Tools-Verzeichnis folgendermaßen aus:

$ ls -F
apache-ant@  apache-ant-1.9.13/  jing@  jing-20091111/   velocity@  velocity-1.7/

Vorbereitung der Ausführungsumgebung

Bereiten Sie das bin-Verzeichnis parallel zum tools-Verzeichnis vor und bereiten Sie die Ausführung des Befehls vor.

$ mkdir bin   ##Erstellen Sie es am selben Speicherort wie das Tools-Verzeichnis.

Bereiten Sie zuerst die bin / envrc-Datei vor.

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}

Dieses Mal bereiten wir eine XML-Datei vor, die die Ameisenaufgabe in bin beschreibt.

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>

Bereiten Sie bin / run-anakia.sh als Wrapper-Skript vor, um diese Vorgänge auszuführen.

bin/run-anakia.sh


#!/bin/bash

SCRIPTFILE="$(readlink -f $0)"
BASEDIR="$(dirname $SCRIPTFILE)"
. "${BASEDIR}/envrc"

## main ##
ant -f ${BASEDIR}/run-anakia.xml "$@"

Wenn dieses Skript ausgeführt wird, führt Jing gleichzeitig die Validierung und die Generierung von HTML-Dateien durch. Es ist jedoch auch möglich, nur die Validierungsaufgabe wie `` $ bin / run-anakia.sh validate_relaxng``` auszuführen.

Als nächstes bereiten Sie speed.properties vor. Die Standardsprache ist Latein-1 (ISO-8859-1), daher ist sie erforderlich.

bin/velocity.properties


input.encoding=UTF-8
output.encoding=UTF-8

Schließlich werden die folgenden Dateien vorbereitet.

$ cd bin
$ ls
envrc  run-anakia.sh  run-anakia.xml  velocity.properties

Artikelvorbereitung

Gehen Sie dann zum Zielverzeichnis und bereiten Sie die drei Dateien vor.

Die erste project.xml ist fast leer, da ich sie nicht speziell verwendet habe.

${target_dir}/project.xml


<?xml version="1.0" encoding="UTF-8"?>
<project name="Anakia"
         href="http://velocity.apache.org/anakia">
</project>

Da das verwendete RelaxNG-Schema und die verwendete VSL-Vorlage lang sind, werden die VSL-Vorlage und die XML-Datei des Artikels mit der RNG-Datei abgeglichen, die aus OASIS Tutorial extrahiert wurde. Wird als Beispiel veröffentlicht.

${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>

Dokumentenerstellung

Legen Sie nach dem Ablegen der Konfigurationsdatei das entsprechende Dokument im selben Verzeichnis ab.

${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>

Wenn Sie das Skript in diesem Verzeichnis starten, erhalten Sie die folgenden Ergebnisse:

$ 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>

Herausforderungen in Zusammenarbeit mit Hugo

Da Hugo selbst keinen Mechanismus zum Hinzufügen eines eigenen Präprozessors hat, muss eine HTML-Datei unter content / as preprocessing getrennt von der Hugo-Ausführung ausgegeben werden.

Platzieren Sie daher die im XML-Format geschriebene Quelldatei in einem Verzeichnis, das nicht unter der Kontrolle von Hugo steht, und geben Sie die HTML-Datei mit Anakia Task an einen beliebigen Speicherort unter dem Inhalt aus.

Da beim Einfügen der HTML-Datei Front Matter hinzugefügt werden muss, ist es besser, Title in die VSL-Datei einzufügen. Ich denke, es wird.

Velocity selbst bietet keine gute Möglichkeit, die Aktualisierungszeit einer Datei zu ermitteln. Um also Front Matter ein Datum hinzuzufügen, geben Sie eine XML-Datei mit dem Dateinamen usw. und der Zeichenfolge des Dateierstellungsdatums als CustomContext an. Es scheint, dass ein gewisser Einfallsreichtum erforderlich ist.

Probleme, die bei der Verwendung von Anakia-1.0 auftreten

Wenn Sie das verteilte Anakia-1.0 verwenden, funktioniert es aufgrund der enthaltenen Geschwindigkeit-1.5.jar möglicherweise nicht wie in der Anakia-Dokumentation beschrieben.

Verwenden Sie $ GeschwindigkeitHasNext

In der VSL-Vorlagendatei ist das zur Beschreibung der am Anfang und Ende der # foreach-Schleife auszuführende Verarbeitung erforderliche `` $ speedHasNext``` in Velocity-1.5 nicht implementiert.

Diese werden als Standardwerte für speed.properties festgelegt. directive.foreach.counter.name = velocityCount directive.foreach.iterator.name = velocityHasNext

Wenn Sie beispielsweise Tags im TOML-Format in Hugos Front Matter schreiben, müssen Sie sie in Klammern wie `tags = [" tag1 "," tag2 "]` setzen, da sie im Listenformat geschrieben sind. Es gibt. Wenn der Tag-Name ursprünglich in einer \ $ -Tags-Variablen im Listenformat gespeichert war, benötigen Sie Code wie diesen, da es keine gute Möglichkeit gibt, das Ergebnis von \ $ tags.size () mit \ $ VelocityCount zu vergleichen. \ $ GeschwindigkeitHasNext ist erforderlich.

#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

Darüber hinaus weisen Versionen vor Velocity-1.7 verschiedene Probleme auf, sodass die Verwendung von Anakia-1.0, das von Velocity-1.5 abhängt, nicht empfohlen wird.

Zusammenfassung - Warum Anakia verwenden?

Als Industriestandard denke ich, dass die Theorie darin besteht, XSLT, XSL-FO zu verwenden, aber für die eindeutige XML-Datei, die durch ein Schema wie RelaxNG definiert ist, ein wohlgeformtes Dokument mit einer gewissen Bedeutung zu erstellen. Ich denke, es ist ein guter Weg, um die Anforderungen der Konvertierung in HTML usw. zu erfüllen.

Persönlich habe ich keine Einwände gegen die Verbreitung von Markdown und Asciidoc, aber ich kann nicht denken, dass es gut ist, weil es praktisch ist.

Ich denke, dass es notwendig ist, eine Anmerkung hinzuzufügen, die ein Hinweis als Referenzmaterial sein kann, das von einem Computer verarbeitet wird, nicht auf AI beschränkt, und selbst wenn Sie kein RDF oder keine Ontologie verwenden, kann der Tag-Name ein Hinweis-XML sein Ich finde das Dokument gut.

Anakia ist einfacher zu erlernen und zu verwenden als XSLT, daher möchte ich es als Werkzeug verwenden und verbreiten.

Recommended Posts

Ich habe jetzt versucht, Anakia + Jing zu verwenden
Ich habe versucht, Gson zu benutzen
Ich habe versucht, TestNG zu verwenden
Ich habe versucht, Galasa zu benutzen
Ich habe versucht, Azure Cloud-Init zu verwenden
Ich habe versucht, Apache Wicket zu verwenden
Ich habe versucht, Java REPL zu verwenden
Ich habe versucht, Spring + Mybatis + DbUnit zu verwenden
Ich habe versucht, JOOQ mit Gradle zu verwenden
Ich habe versucht, die Java8 Stream API zu verwenden
Ich habe versucht, JWT in Java zu verwenden
[Android] Ich habe versucht, das Koordinatorlayout zu verwenden.
Ich habe versucht, Pari GP Container zu verwenden
Ich habe versucht, WebAssembly Stadio (Version 2018/4/17) zu verwenden.
Ich habe jetzt versucht, Java 8 zusammenzufassen
Ich habe versucht, Java Memo LocalDate zu verwenden
Ich habe versucht, Google HttpClient von Java zu verwenden
Ich habe versucht, die Elasticsearch-API in Java zu verwenden
Ich habe versucht, Realm mit Swift UI zu verwenden
Ich habe versucht, das Java-Diagnosetool Arthas zu verwenden
Ich habe versucht, UICollectionViewListCell zu verwenden, das von Xcode12 hinzugefügt wurde.
Ich habe versucht, Scalar DL mit Docker zu verwenden
Ich habe versucht, OnlineConverter mit SpringBoot + JODConverter zu verwenden
Es ist neu, aber ich habe versucht, Groonga zu verwenden
Ich habe versucht, OpenCV mit Java + Tomcat zu verwenden
Ich habe es mit Spring versucht.
Ich habe versucht, Tomcat zu setzen
Ich habe youtubeDataApi ausprobiert.
Ich habe versucht, ① umzugestalten
Ich habe FizzBuzz ausprobiert.
Ich habe JHipster 5.1 ausprobiert
Ich habe versucht, Junit mit Mac VScode Maven zu verwenden
[Für Anfänger] Ich habe versucht, DBUnit mit Eclipse zu verwenden
[Für Anfänger] Ich habe versucht, JUnit 5 mit Eclipse zu verwenden
[Android] Ich habe SQLite beendet und versucht, Realm zu verwenden
Ich habe mit Ruby einen Blackjack gemacht (ich habe versucht, Minitest zu verwenden)
[API] Ich habe versucht, die Postleitzahlensuch-API zu verwenden
Ich habe versucht, einen Server mit Netty zu implementieren
Ich habe versucht, den Profiler von IntelliJ IDEA zu verwenden
Ich habe versucht, eine Datenbankverbindung in der Android-Entwicklung zu verwenden
[Ich habe es versucht] Spring Tutorial
Ich habe versucht, die Server-Push-Funktion von Servlet 4.0 zu verwenden
Ich habe versucht, Autoware auszuführen
Ich habe versucht, den KMS-Dienst (Key Management Service) von Alibaba Cloud zu verwenden
Ich habe versucht, SQS mit AWS Java SDK zu betreiben
Ich habe sofort QUARKUS ausprobiert
Ich habe versucht, das Migration Toolkit für Anwendungsbinärdateien zu verwenden
Ich habe versucht, Log4j2 auf einem Java EE-Server zu verwenden
Ich habe Spring Batch ausprobiert
Ich habe versucht, YOLO v4 unter Ubuntu und ROS zu verwenden
Ich habe versucht, node-jt400 (Programme)
Ich habe versucht, die erweiterte for-Anweisung in Java zu verwenden
Ich habe versucht, node-jt400 (ausführen)
~ Ich habe jetzt versucht, funktionale Programmierung mit Java zu lernen ~
Ich habe versucht, ein Aktienchart mit Java (Jsoup) zu kratzen.
Ich habe versucht, node-jt400 (Transaktionen)