XSL -> XHTML с установленным в шаблоне типом документа, не преобразуется

Я пытаюсь создать действительный документ XHTML из данных XML.
Я делаю это с использованием библиотеки объектов MSXML, а не.NET. С.NET проблем нет, трансформируется просто отлично.

Мой шаблон XSL имеет это:

<xsl:output
  method="xml"
  omit-xml-declaration="no"
  indent="no"
  version="1.0"
  encoding="utf-8"
  doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"
  doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
/>

Потом идет:

<xsl:template match="/root">
  <html xmlns="http://www.w3.org/1999/xhtml">
  ...
  </html>
</xsl:template>

И наступают проблемы.

  • Если я использую MSXML2.DOMDocument40, MSXML отказывается генерировать XHTML, потому что

    Атрибут '{xmlns}' для этого элемента не определен в DTD/Schema.

    По всей видимости, одному из тегов HTML в теле шаблона не разрешено иметь пространство имен, которое он наследует <html>, Но MSXML не скажет мне, что это за тег.

    Если я просто вычеркну все из шаблона и дам данные XML, вложенные в <p>, то это прекрасно преобразуется. По-видимому, <p> разрешено иметь xmlns,

    Что это за тег, который все разрушает для меня?

  • Если я использую MSXML2.DOMDocument60, я сначала должен сказать:

    xmlTransformedResult.setProperty("ProhibitDTD", False)
    

    В противном случае я получаю "DTD запрещено".

    Имея эту настройку, я получаю:

    Элемент 'html' используется, но не объявлен в DTD/Schema.

    Как я могу это исправить?

  • Если я использую.NET преобразование, все нормально. Сгенерированный документ начинается с

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    

Теперь я могу удалить оба doctype-public а также doctype-system из шаблона создайте просто обычный XML, а затем вручную добавьте к нему заголовок. Но я не хочу. Как правильно сделать эту работу?

1 ответ

Я думаю, что проблема с MSXML 6 заключается в том, что по умолчанию он не допускает DTD и не загружает их (или любые внешние ресурсы в целом). Поэтому, чтобы избежать сообщения о проверке, вам нужно установить оба (я использую синтаксис JScript, пожалуйста, настройте ваш язык по вашему выбору):

xmlTransformedResult.resolveExternals = true;
xmlTraansformedResult.setProperty('ProhibitDTD', false);

Тогда я думаю, что вы не получите ошибку проверки. По крайней мере, до тех пор, пока W3C будет обслуживать файлы DTD XHTML, я думаю, что когда вы делаете это программно много, вы можете получить ошибки, но это не зависит от MSXML, это просто политика W3C, чтобы избежать слишком большого трафика на их серверы всеми, кто выбирает такие DTD.

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