Загрузить объекты в XSLT 2?
Я использую программу XSLT 2.0 для обработки некоторых документов MathML. В этих MathML есть такие объекты, как ⁡
а также ⁢
, которые дают мне "сущность не определена" ошибки. Есть ли способ обработки документов с этими объектами без загрузки схемы MathML? (Потому что Саксон-ОН не может использовать xsl:import-schema
...)
И просто для ясности, мне не нужно использовать сущности в моем XSLT; Мне нужно обработать XML-файлы, которые их имеют.
Есть файл сущности для MathML, подобный этому:
<!ENTITY AElig "Æ" ><!--LATIN CAPITAL LETTER AE -->
<!ENTITY AMP "&#38;" ><!--AMPERSAND -->
<!ENTITY Aacute "Á" ><!--LATIN CAPITAL LETTER A WITH ACUTE —>
...
Может быть, я могу как-то использовать это?
ОБНОВЛЕНИЕ: много людей упомянули, что у входных документов должно быть правильное DTD. Итак, вот минимальный пример:
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>
MathML с объявлением DTD:
<?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> ⁡ </mo>
<mi> x </mi>
</mrow>
</math>
Теперь Саксон дает мне эту ошибку:
I/O error reported by XML parser processing file:/path/to/mathml.xml: unknown protocol: classpath
2 ответа
Я имел успех в прошлом, объявив сущности в файле XSL. Например:
<!DOCTYPE stylesheet [
<!ENTITY lsquo "<xsl:text disable-output-escaping='yes'>&#x2018;</xsl:text>">
<!ENTITY rsquo "<xsl:text disable-output-escaping='yes'>&#x2019;</xsl:text>">
<!ENTITY ldquo "<xsl:text disable-output-escaping='yes'>&#x201C;</xsl:text>">
<!ENTITY rdquo "<xsl:text disable-output-escaping='yes'>&#x201D;</xsl:text>">
]>
... добавлено вверху файла, сразу после <?xml?>
декларация и непосредственно перед <xsl:stylesheet>
элемент. Я подозреваю, что подобный подход поможет в вашем случае.
Просто для подкрепления других ответов / комментариев расширение сущности является обязанностью синтаксического анализатора XML и не имеет ничего общего с процессором XSLT. Чтобы XML был правильно сформирован, сущности должны быть объявлены, что означает, что вам нужно иметь (внутреннее или внешнее) DTD, которое ссылается на них: то есть исходный документ должен иметь подходящее объявление DOCTYPE.
Единственный вклад, который сделает Saxon, заключается в том, что он делает свой собственный EntityResolver доступным для анализатора XML. Термин "EntityResolver" является немного неправильным, потому что он на самом деле не расширяет ссылки на сущности, такие как ⁢
; все, что он делает - это находит внешние файлы DTD, чтобы удовлетворить системные идентификаторы и публичные идентификаторы, которые появляются в вашем объявлении DOCTYPE.