Erhaltung entity-Referenzen beim transformieren von XML mit XSLT?
Wie kann ich die preserve-entity-Referenzen beim transformieren von XML mit XSLT (2.0)? Mit allen Prozessoren, die ich habe versucht, die Einheit wird standardmäßig aufgelöst. Ich kann verwenden xsl:character-map
zu handhaben, die Zeichen-Entitäten, aber was ist mit text-Entitäten?
Beispielsweise das XML:
<!DOCTYPE doc [
<!ENTITY so "stackoverflow">
<!ENTITY question "How can I preserve the entity reference when transforming with XSLT??">
]>
<doc>
<text>Hello &so;!</text>
<text>&question;</text>
</doc>
verwandelt sich in die folgenden XSLT:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
erzeugt die folgende Ausgabe:
<doc>
<text>Hello stackoverflow!</text>
<text>How can I preserve the entity reference when transforming with XSLT??</text>
</doc>
Die Ausgabe sollte so Aussehen wie die Eingabe (ohne die doctype-Deklaration für jetzt):
<doc>
<text>Hello &so;!</text>
<text>&question;</text>
</doc>
Ich bin Hoffnung, dass ich nicht auf pre-Prozess die Eingabe durch den Austausch aller kaufmännisches mit &
(wie &question;
) und dann post-Prozess die Ausgabe durch den Austausch aller &
mit &
.
Vielleicht ist das Prozessor-spezifisch ist? Ich bin mit Saxon 9.
Dank!
- Gute Frage, +1. Die angeforderte Verarbeitung ist fast unmöglich zu tun mit XSLT und ich würde nicht empfehlen, mit meiner Antwort Häufig.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie wissen, welche Einheiten werden verwendet und wie sind Sie definiert haben, können Sie die folgenden (ziemlich primitiv und fehleranfällig, aber immer noch besser als nichts):
, wenn angewandt auf das XML-Dokument:
das erwartete Ergebnis produziert wird:
Tun, beachten Sie:
Den besonderen (RegEx) - Zeichen in den Ersetzungen, die geschützt werden müssen.
Mussten wir auflösen, um DOE, die nicht empfohlen wird, weil es gegen die Grundsätze der XSLT-Architektur und-Verarbeitung Modell-in anderen Worten diese Lösung ist ein ekliger hack.
Dies kann eine besonders lästige Problem, wenn Sie mit so etwas wie S1000D. Es nutzt Entitäten und @boardno Attribute link-zu zahlen. Es ist eine Reminiszenz an seine SGML-Wurzeln.
Weil diese automatische Einheit erweitert Verhalten, das ist richtig, aber undesireable, habe ich oft zu drop zurück zu tools wie sed, awk und batch-Skripten, die zur Verwaltung bestimmter Daten-Analyse-Aufgaben bei der Verwendung von S1000D als Eingabe.
IMHO, wäre dies eine große änderung Vorschlag für eine der kommenden XSLT-Spezifikationen, dass ein kompatibler Prozessor akzeptieren eine runtime-parameter, die das ein-und ausschalten Konzern auszuführen Erweiterungen.
Wenn Sie eine Java-Implementierung des XSLT 2.0-Prozessor (wie Saxon 9 Java), möchten Sie vielleicht zu prüfen, ob http://andrewjwelch.com/lexev/ hilft, können Sie Vorverarbeiten Ihre XML-Daten mit entity-und character-Referenzen, die Art und Weise, um Sie zu bekommen markiert als XML-Elemente können Sie dann verwandeln, wie es notwendig ist.
Ich diese Lösung verwenden und es funktioniert gut :
xsl:analyze-string
zu analysieren, den prolog und den Aufbau einer Struktur (oder eine Karte, die in 3.0) von Schlüssel/Wert-Paare und dann ersetzen Sie Sie während der Verarbeitung. Ich kann versuchen, dass eines Tages (+1 für die Idee). Tatsächlich lösen dieses Problem/Frage, ich landete schreiben Sie eine Omnimark-Programm, ähnlich wie die "lexev" java-Programm erwähnt in einer anderen Antwort.Sie halten können EntityReference-Knoten in die Dokument mit einem DOM-LS-parser mit "Entitäten" - parameter auf true festgelegt.
http://docs.oracle.com/javase/6/docs/api/org/w3c/dom/DOMConfiguration.html
Die Spezifikation sagt, dass der default-Wert ist true, aber je nach parser, könnte es falsch sein, bewusst sein, dass.
Laden Xerces :
Können Sie die Registrierung verwenden, wie unten auch, aber personnaly, würde ich eher fest die Umsetzung ich möchte wie oben:
Dann laden Sie Ihre Dokument :
Dann Ihre XML-Entitäten, die nicht erweitert werden, in der DOM.
Dann, weil SÄCHSISCHEN behandelt nicht die Personen nicht erweitert werden ('nicht unterstützter Knotentyp in der DOM! 5' - Fehler), die Sie nicht verwenden können
net.sf.saxon.xpath.XPathFactoryImpl
Sie haben, um den Standard-XPathFactory von Xerces mit XPathFactory.newInstance()[Fatal Error] :xxx:yyy: Character reference "&#