2017-07-11 1 views
2

Ich verwende ein XSLT 2.0-Programm, um einige MathML-Dokumente zu verarbeiten. In diesen MathMLs gibt es Entitäten wie ⁡ und ⁢, die mir "Entity nicht definiert" -Fehler geben. Gibt es eine Möglichkeit, Dokumente mit diesen Entitäten zu verarbeiten, ohne das MathML-Schema zu laden? (Weil Saxon-HE xsl:import-schema nicht verwenden kann ...)Einheiten in XSLT 2 laden?

Und nur um klar zu sein, brauche ich nicht die Entitäten in meinem XSLT zu verwenden; Ich muss XMLs verarbeiten, die sie haben.

Es gibt eine Entity-Datei für MathML wie folgt aus:

<!ENTITY AElig   "&#x000C6;" ><!--LATIN CAPITAL LETTER AE --> 
<!ENTITY AMP    "&#38;#38;" ><!--AMPERSAND --> 
<!ENTITY Aacute   "&#x000C1;" ><!--LATIN CAPITAL LETTER A WITH ACUTE —> 
... 

Vielleicht kann ich irgendwie Gebrauch davon?

UPDATE: mehrere Personen haben erwähnt, dass die Eingabedokumente die richtige DTD haben sollten. Also hier ist ein minimales Beispiel:

Die XSLT:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="2.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema" 
       xmlns:m="http://www.w3.org/1998/Math/MathML"> 
    <xsl:output method="text"/> 

    <xsl:template match="/"> 
    <xsl:text>aaa</xsl:text> 
    </xsl:template> 
</xsl:stylesheet> 

Die MathML mit DTD-Deklaration:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE math PUBLIC "-//W3C//DTD MathML 2.0//EN" 
    "http://www.w3.org/Math/DTD/mathml2/mathml2.dtd"> 
<math xmlns="http://www.w3.org/1998/Math/MathML"> 
    <mrow> 
    <mi> sin </mi> 
    <mo> &ApplyFunction; </mo> 
    <mi> x </mi> 
    </mrow> 
</math> 

Jetzt Saxon gibt mir diese Fehlermeldung:

I/O error reported by XML parser processing file:/path/to/mathml.xml: unknown protocol: classpath 
+0

Wenn Sie diese Fehler beim Lesen der Eingabe-XML erhalten, dann klingt es so, als ob Ihr XML unvollständig ist und Sie die deklarierten Entitäten benötigen. Andernfalls weiß der XML-Parser nicht, welchen Inhalt er für die Entitätsreferenz ersetzen soll. http://xmlwriter.net/xml_guide/entity_declaration.shtml –

+0

https://Stackoverflow.com/a/9128457/14419 –

+0

@MadsHansen Das ist eine interessante Lösung. Aber ich fürchte, ich kann es nicht benutzen. Zuallererst, damit es funktioniert, kann das enthaltene XML-Dokument keinen '' Header haben, auf den ich keine Kontrolle habe. Die MathML-Dokumente, die ich verarbeite, werden dynamisch generiert und haben den Header. Außerdem muss die Wrapper-Datei auf die enthaltene Datei anhand ihres Namens verweisen. Wenn das enthaltene XML-Dokument dynamisch generiert wird, muss ich auch die Wrapper-Datei dynamisch erzeugen, was XSLT meiner Meinung nach nicht kann. – MetroWind

Antwort

1

Ich habe hatte in der Vergangenheit Erfolg, indem die Entitäten in der XSL-Datei deklariert wurden. Zum Beispiel:

<!DOCTYPE stylesheet [ 
<!ENTITY lsquo "<xsl:text disable-output-escaping='yes'>&amp;#x2018;</xsl:text>"> 
<!ENTITY rsquo "<xsl:text disable-output-escaping='yes'>&amp;#x2019;</xsl:text>"> 
<!ENTITY ldquo "<xsl:text disable-output-escaping='yes'>&amp;#x201C;</xsl:text>"> 
<!ENTITY rdquo "<xsl:text disable-output-escaping='yes'>&amp;#x201D;</xsl:text>"> 
]> 

... hinzugefügt am Anfang der Datei, kurz nach der <?xml?> Erklärung und kurz vor dem <xsl:stylesheet> Elemente. Ich vermute, dass ein ähnlicher Ansatz in Ihrem Fall helfen würde.

+1

Damit können Sie diese Entity-Referenzen im Stylesheet verwenden. Es hilft nicht, wenn Sie sie im Quelldokument verwenden möchten. Außerdem ist es nicht sinnvoll, sie so zu definieren, dass sie in xsl: text-Anweisungen erweitert werden, wenn Sie sie in Attributen verwenden möchten. –

+0

@ MichaelKay, danke für die Klärung beider Punkte. –

1

Nur um die anderen Antworten/Kommentare zu verstärken, ist die Entity-Erweiterung in der Verantwortung des XML-Parsers und hat nichts mit dem XSLT-Prozessor zu tun. Damit das XML wohlgeformt ist, müssen die Entitäten deklariert werden, was bedeutet, dass Sie eine (interne oder externe) DTD haben müssen, die auf sie verweist. Das heißt, das Quelldokument muss eine geeignete DOCTYPE-Deklaration haben.

Der einzige Beitrag, den Saxon leistet, ist, dass es dem XML-Parser seinen eigenen EntityResolver zur Verfügung stellt. Der Begriff "EntityResolver" ist ein bisschen irreführend, weil er Entitätsreferenzen wie &InvisibleTimes; nicht wirklich erweitert; Es werden nur externe DTD-Dateien gesucht, um die System-IDs und öffentlichen IDs zu erfüllen, die in Ihrer DOCTYPE-Deklaration angezeigt werden.