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

Я пытаюсь создать действительный документ 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 / схеме.

    Очевидно, что одному из тегов 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 Ответ

1 голос
/ 03 августа 2011

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

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

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

...