Я использую MSXML 6.0 для преобразования своего собственного XML в другой формат XML.Я не уверен, что, может быть, я просто не совсем понимаю, как работает MSXML, но я думаю, что заметил какое-то странное поведение с ним ....
Я добавляю пространства имен в свой XML-документ, используя setProperty метод, например
XmlDocument.setProperty('SelectionNamespaces',
' xmlns:ms=''http://mydomain.com/2010/MySchema''');
Затем я создаю XML, используя свой собственный сериализатор в памяти (не сохраняя на диск).После сериализации я загружаю файл XSLT и выполняю преобразование, используя transformNodeToObject например,
AppXmlDoc.transformNodeToObject(XslXmlDoc, AStreamForTransformedXml);
Проблема заключается в том, что преобразование работает, но в нем нет ни одного конкретного шаблона, соответствующего XPath.является.Я устранил все проблемы с самим файлом XSLT, запустив его с тестовыми данными через Visual Studio, и он работал как положено.Затем я предположил, что это, должно быть, проблема с кодировкой, поэтому я убедился, что все документы были прочитаны / записаны как UTF-8 .... все еще не повезло.
Вот пример того, чтоtransform выглядит следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ms="http://mydomain.com/2010/MySchema" exclude-result-prefixes="ms">
<xsl:template match="/">
<ARoot>
<head>
<xsl:apply-templates select="ms:Element/ms:SubElement" />
</head>
<body>
<xsl:apply-templates select="ms:Element/ms:DifferentSubElement" />
</body>
</ARoot>
Таким образом, результат преобразования при запуске через MSXML переносит базовую структуру, но не включает никаких данных шаблона.После некоторого тестирования я обнаружил, что единственный способ заставить его работать - это выполнить следующие шаги:
- Создать новый документ XML
- Установить информацию о пространстве имен с помощью
setProperty
- Сериализация XML и сохранение на диск.
- Закрытие документа - дополнительный шаг
- Создание нового документа XML - дополнительный шаг
- Перезагрузить документ - дополнительный шаг
- Переустановить информацию о пространстве имен - дополнительный шаг
- Выполнить преобразование.
Похоже, MSXML в какой-то момент теряет информацию о пространстве имен.Что делает его еще более странным, это даже если вы сбрасываете информацию о пространстве имен (после сериализации) и пробуете преобразование, которое все равно не работает!Может показаться, что это сработает, только если я сохраню документ, закрою его, заново создаю новый XML-документ и снова загрузлю его (что, как следствие, мне нужно для сброса пространств имен).
У кого-то есть мысли / идеина этом?