DOCTYPE устарела и Xinclude не делает этого

Мне нужен способ включить фрагментированный XML, не содержащий глобальный открывающий / закрывающий тег / элемент. Фрагмент растет, потому что программа время от времени добавляет в него данные (больше блоков), поэтому у них не будет ни конечного, ни начального тега. Я использовал!DOCTYPE с!ENTITY, но это устарело, и новый Xinclude, похоже, не имеет возможности импортировать его, поскольку заставляет фрагмент иметь "один" открывающий и закрывающий тег.

Дополнительная информация: Следующее работает нормально с IE-10, но не работает в IE-11. Последний не импортирует файл current.log.

Примечание. Microsoft Edge не поддерживает его в соответствии с данным веб-сайтом: https://docs.microsoft.com/en-us/internet-explorer/ie11-deploy-guide/deprecated-document-modes

<?xml version='1.0' encoding='ISO-8859-1'?>
<?xml-stylesheet type='text/xsl' href='IndexLog.xsl'?>

<!DOCTYPE myRoot [<!ENTITY thisMonthLog SYSTEM "current.log">]>

<myRoot>
    &thisMonthLog;
</myRoot>

журнал current.log выглядит так:

<block>
   <a>any text</a>
   <b>any text</b>
   <c>any text</c>
   <d>any text</d>
   <e>any text</e>
</block>
<block>
   <a>any text</a>
   <b>any text</b>
   <c>any text</c>
   <d>any text</d>
   <e>any text</e>
</block>

1 ответ

Решение

Исходя из ваших комментариев, я понимаю, что вы загружаете XML-документ из файловой системы непосредственно с IE 11. Я думаю, что IE перешел на использование MSXML 6 вместо MSXML 3 по умолчанию для XSLT, а MSXML 6 по умолчанию запрещает DTD и не загружает внешние объекты, Единственный известный мне способ обойти это - использовать MSXML 6 со сценарием и установить свойства, необходимые для разрешения DTD, загрузки внешних ресурсов (и в вашем случае, поскольку DTD используется только для загрузки внешнего объекта, чтобы отключить проверку):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:output method="html" indent="yes" version="5" doctype-system="about:legacy-doctype"/>

    <xsl:template match="/">
        <html>
            <head>
                <title>Test</title>
                <script>
                    function runXslt(xmlUri, xsltUri, targetElement) {
                      var xmlDoc = new ActiveXObject('Msxml2.DOMDocument.6.0');
                      xmlDoc.async = false;
                      xmlDoc.resolveExternals = true;
                      xmlDoc.validateOnParse = false;
                      xmlDoc.setProperty('ProhibitDTD', false);
                      xmlDoc.load(xmlUri);

                      var xsltDoc = new ActiveXObject('Msxml2.DOMDocument.6.0');
                      xsltDoc.async = false;
                      xsltDoc.load(xsltUri);

                      targetElement.insertAdjacentHTML('beforeEnd', xmlDoc.documentElement.transformNode(xsltDoc));
                    }
                </script>
                <script>
                    document.addEventListener(
                      'DOMContentLoaded',
                      function() {
                        runXslt('test201706070101.xml', 'test2017060701.xsl', document.body);
                      },
                      false
                    );
                </script>
            </head>
            <body>
                <h1>Test</h1>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="myRoot">
        <section>
            <h2>Content</h2>
            <xsl:apply-templates/>
        </section>  
    </xsl:template>

    <xsl:template match="block">
        <ul>
            <xsl:apply-templates/>
        </ul>
    </xsl:template>

    <xsl:template match="block/*">
        <li>
            <xsl:apply-templates/>
        </li>
    </xsl:template>

</xsl:stylesheet>

Таким образом, если входной документ test201706070101.xml с содержанием

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="test2017060701.xsl"?>
<!DOCTYPE myRoot [
  <!ENTITY thisMonthLog SYSTEM "test201706070102.xml">
]>
<myRoot>
    &thisMonthLog;
</myRoot>

загружается в IE 11 и сценарии включены, полный журнал анализируется, например, со вторым документом, имеющим

<?xml version="1.0" encoding="UTF-8"?>
<block>
    <a>any text</a>
    <b>any text</b>
    <c>any text</c>
    <d>any text</d>
    <e>any text</e>
</block>
<block>
    <a>any text</a>
    <b>any text</b>
    <c>any text</c>
    <d>any text</d>
    <e>any text</e>
</block>

и таблица стилей, как уже опубликовано, вывод в окне IE

Test


Content
•any text
•any text
•any text
•any text
•any text
•any text
•any text
•any text
•any text
•any text

поэтому внешний объект был загружен. Основным недостатком, очевидно, является необходимость использования сценария, а другим недостатком является то, что используемый сценарий с MSXML и ActiveXObject не совместим с Edge, поскольку он не поддерживает ActiveXObject.

Я публикую этот ответ как предложение о том, что может помочь, если вы хотите положиться на IE для преобразования XSLT, в конечном итоге, возможно, было бы лучше перенести преобразование XSLT в HTML на платформу, подобную.NET, где вы лучше контролируете, как выполняется синтаксический анализ XML. и обработка XSLT взаимодействуют.

Файлы примеров доступны по адресу https://martin-honnen.github.io/xslt/2017/test201706070101.xml, https://martin-honnen.github.io/xslt/2017/test201706070102.xml и https://martin-honnen.github.io/xslt/2017/test2017060701.xsl хотя я понимаю, что вы хотите сделать это локально, а не через HTTP(S).

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