Загрузить объекты в XSLT 2?

Я использую программу XSLT 2.0 для обработки некоторых документов MathML. В этих MathML есть такие объекты, как ⁡ а также ⁢, которые дают мне "сущность не определена" ошибки. Есть ли способ обработки документов с этими объектами без загрузки схемы MathML? (Потому что Саксон-ОН не может использовать xsl:import-schema...)

И просто для ясности, мне не нужно использовать сущности в моем XSLT; Мне нужно обработать XML-файлы, которые их имеют.

Есть файл сущности для MathML, подобный этому:

<!ENTITY AElig            "&#x000C6;" ><!--LATIN CAPITAL LETTER AE -->
<!ENTITY AMP              "&#38;#38;" ><!--AMPERSAND -->
<!ENTITY Aacute           "&#x000C1;" ><!--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> &ApplyFunction; </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'>&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>">
]>

... добавлено вверху файла, сразу после <?xml?> декларация и непосредственно перед <xsl:stylesheet> элемент. Я подозреваю, что подобный подход поможет в вашем случае.

Просто для подкрепления других ответов / комментариев расширение сущности является обязанностью синтаксического анализатора XML и не имеет ничего общего с процессором XSLT. Чтобы XML был правильно сформирован, сущности должны быть объявлены, что означает, что вам нужно иметь (внутреннее или внешнее) DTD, которое ссылается на них: то есть исходный документ должен иметь подходящее объявление DOCTYPE.

Единственный вклад, который сделает Saxon, заключается в том, что он делает свой собственный EntityResolver доступным для анализатора XML. Термин "EntityResolver" является немного неправильным, потому что он на самом деле не расширяет ссылки на сущности, такие как &InvisibleTimes;; все, что он делает - это находит внешние файлы DTD, чтобы удовлетворить системные идентификаторы и публичные идентификаторы, которые появляются в вашем объявлении DOCTYPE.

Другие вопросы по тегам