2013-05-12 1 views
0

При применении XSLT к XML-файлу, указанному ниже, совпадение не найдено. Это преобразование выполняется на клиентской стороне в Internet Explorer 8 с использованием библиотеки Msxml2. Хотя мое конечное приложение намного сложнее, простой тест ниже терпит неудачу.XSLT, не отвечающий задачам, пространствам имен и вызовам Doctype

XML:

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE document SYSTEM 'xmlschemas/domino_8_5_3.dtd'> 
<document xmlns='http://www.lotus.com/dxl' version='8.5' maintenanceversion='3.0' 
replicaid='862570A600460D8C' form='Appeal'> 
<item name="criteria"></item> 
</document> 

XSLT:

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

<xsl:template match="dxl:document"> 
    <xsl:text>It worked!</xsl:text> 
</xsl:template> 

</xsl:stylesheet> 

Я прочитал бесчисленное 'решение' о пространствах имен и попытался их все ... это всегда не совпадает. ! Через пару сценариев я был в состоянии получить весь документ, удалив DOCTYPE тег, но согласующий тогда не работает (только не вернулся весь текст и не показывал

EDIT «Сработало!»: Тот же самый код который делает произведение преобразования в другой части моего заявления, но не в этом случае Вот код:.

var xml2; 
var xsl2; 

$.get("test2.xml", function(data) { getXSL(data); }); 

function getXSL(data) { 
    xml2 = new ActiveXObject("Msxml2.DOMDocument.6.0") 
    xml2.loadXML(data); 

    $.get("test2.xsl", function(data) { transformCriteriaXML(data); }); 
} 

function transformCriteriaXML(data) { 
    xsl2 = new ActiveXObject("Msxml2.DOMDocument.6.0") 
    xsl2.loadXML(data); 

    var outFile; 
    var objFSO = new ActiveXObject("Scripting.FileSystemObject"); 
    outFile = "output.txt"; 
    var objFile = objFSO.CreateTextFile(outFile, true); 
    objFile.Write(xml2.transformNode(xsl2)); 
    objFile.Close(); 
} 

различные операционные системы и различные версии IE не являются предметом переговоров, как это приложение, компании и единственным доступным IE - версия 8.0 (причина, по которой приведенный выше код позволяет мне написать файл на локальный ПК, - это приложение HTML (.hta), и поэтому ограничения безопасности отключены.)

выход.txt сверху только когда-либо показывает <?xml version="1.0" encoding="utf-8"?>.

+0

Вам необходимо отредактировать вопрос и предоставить полный (но небольшой) пример кода на стороне клиента, чтобы люди могли самостоятельно воспроизвести проблему. Пока это не будет сделано, этот вопрос довольно висит в воздухе - допускает разные интерпретации и заставляет людей прибегать к догадкам. Кроме того, почему IE8? Последний выпущенный MS-браузер - как для Win 7, так и для Win 8 - IE10. Весьма важно, я считаю, что вам не нужен DTD (по крайней мере XSLT делает очень мало, если его использовать). Даже если он предназначен для проверки, это лучше делать офлайн, а не тысячи раз - для каждого HTTP-запроса. –

+0

Попробуйте добавить: 'xml2.async = false;' и 'xsl2.async = false;' перед каждым вызовом метода 'Load()'. См. Рабочий пример здесь: http://msdn.microsoft.com/en-us/library/windows/desktop/ms761399(v=vs.85).aspx –

+0

@DimitreNovatchev: Я попробовал его с флагом, установленным в обоих направлениях с помощью мои тесты, и, похоже, вместо этого MSXML отказывается генерировать недопустимый XML-документ для вывода. См. Мой ответ ниже. – Borodin

ответ

1

Последняя версия MSXML2 - это версия 2.6, которая в последний раз обновлялась в 2004 году и считается устаревшей.

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

Можем ли мы знать, что находится в вашем DTD? Я не могу думать ни о чем, что помешало бы трансформироваться, но было бы неплохо это увидеть.

Последняя версия MSXML - это версия 6.0, которая предварительно установлена ​​в Windows 7. Она доступна для загрузки с Microsoft Download Centre для XP.


Update

OK Я имел некоторый успех. Я обнаружил, что, вероятно, является ошибкой в ​​MSXML, поскольку он не будет создавать ничего, что недействительно XML как вывод, даже если элемент output в таблице стилей говорит method="text". Это противоречит стандарту XSLT, но является типичным Microsoft.

См. this similar problem on GNT. Похоже, что ошибка связана с тем, что DOMDocument.transformNodeToObject используется для преобразования в другой объект DOMDocument, который не может представлять собой обычный текст. По-видимому, он также примет простой объект stream здесь, но я больше не смотрел, поскольку здесь не требуется вывод текста.

Я получил именно ваш код работает, если я удалить DOCTYPE из XML, а также добавить корневой элемент вокруг текста таблицы стилей выходы, как этот

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

    <xsl:template match="dxl:document"> 
    <root> 
     <xsl:text>It worked!</xsl:text> 
    </root> 
    </xsl:template> 

</xsl:stylesheet> 

, который производит этот выход

<?xml version="1.0" encoding="UTF-16"?> 
<root xmlns:dxl="http://www.lotus.com/dxl">It worked!</root> 
+0

DTD 200KB большой, но независимо от того, доступен ли он IE во время преобразования, не изменяется результат преобразования. Какие другие двигатели XSLT предлагаются? Предпочтительно тот, который уже установлен по умолчанию на машинах Windows XP/7. –

+0

Я добавил к своему ответу, чтобы указать, где вы можете получить последний MSXML. – Borodin

+0

MSXML версия 6.0 создается путем вызова MSXML2 и указания номера версии в классе. например (и так я называю это) 'new ActiveXObject (" Msxml2.DOMDocument.6.0 ")'. Вы говорите, когда вы называете это, что он функционирует правильно? –

Смежные вопросы