Проблема с XslCompiledTransform и xslt в VB.NET - PullRequest
0 голосов
/ 02 июня 2011

Я получаю сейчас, где с этим.У меня есть документ XML, который должен быть преобразован с использованием листа xslt.Мой код выглядит следующим образом:

        Dim xStream As New IO.MemoryStream

        ' Create the XslCompiledTransform and load the stylesheet.
        Dim xslt As New XslCompiledTransform()
        xslt.Load(strLKxsl)

        ' Create the XslCompiledTransform and load the stylesheet.
        Dim xslt As New XslCompiledTransform()
        xslt.Load(strXSLfolder & "xslt_lookup.xslt")

        ' Create the XsltArgumentList.
        Dim xslArg As New XsltArgumentList()

        Using w As XmlWriter = XmlWriter.Create(xStream)
            ' Transform the file.
            xslt.Transform(xmldLookup, Nothing, w)
        End Using

Я получаю следующую ошибку в строке xslt.Transform (xmldLookup, Nothing, w):

Результатом будет маркер StartElement в состоянии EndRootElementв недействительном документе XML.Убедитесь, что для параметра ConformanceLevel установлено значение ConformanceLevel.Fragment или ConformanceLevel.Auto, если вы хотите записать фрагмент XML.

Это содержимое файла XMl:

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="includes/xslt_lookup.xslt"?>
<lookup xmlns="logis-online:lk"
title="<Document Title>"
nexturl="<URL>">

  <search visible="false">
    <field id="SUPPLIER_NO" hidden="true" size="10"
    value="<Value>" />
    <field id="WEB_STORE_NO" hidden="true" size="10"
    value="<Value>" />
    <field id="REST" hidden="true" size="40" value="" />
    <field id="LOOKUP_ACTION" hidden="true" size="1" value="<Value>" />
    <field id="WEB_ACTION" hidden="true" size="2" value="<Value>" />
  </search>
  <results>
    <header>
      <section>
        <item id="SUPPLIER_NO" title="Supplier No" value="<Value>"
        HelpID="10" />
        <item id="SUPPLIER_NAME_SHORT" title="Supplier Name"
        value="<Value>" HelpID="10" />
        <item id="LIABLE_STORE_NO" title="Liable Store No"
        value="<Value>" HelpID="98" />
      </section>
    </header>
    <list target="<lookup aspx page>" />
  </results>
</lookup>

Ответы [ 2 ]

1 голос
/ 02 июня 2011

Вероятно, проблема вызвана тем, что ваш XSLT-код создает какой-то вывод, который не является правильно сформированным XML-документом, а представляет собой только фрагмент, возможно, имеющий несколько элементов верхнего уровня. Это возможно с XSLT, и если вы просто пишете в файл или поток, у вас не должно возникнуть никаких проблем. Ваш код по причинам, которые вы не объяснили, создает XmlWriter поверх MemoryStream, и по умолчанию любой XmlWriter, созданный с помощью XmlWriter.Create (stream), проверяет, что любой вывод является правильно сформированным XML-документом, и выдает исключение, если нет. Поэтому, чтобы избежать проблемы, вы либо вообще не создаете XmlWriter, а просто делаете

xslt.Transform(xmldLookup, Nothing, xStream)

или вы создаете XmlWriter с помощью OutputSettings экземпляра XslCompiledTransform, например

Using xw As XmlWriter = XmlWriter.Create(xStream, xslt.OutputSettings)
0 голосов
/ 02 июня 2011

Это сообщение не требует пояснений. Это означает, что результат преобразования XSLT не является правильно сформированным документом, и для того, чтобы заставить XmlWriter написать такую ​​вещь, его параметр ConformanceLevel должен быть установлен / задан как ConformanceLevel.Fragment или ConformanceLevel.Auto. Подробнее о «Соответствии данных и XmlWriter» здесь .

Если преобразование XSLT не предназначено для создания документа XML, лучше не указывать XmlWriter для получения результата. Лучше было бы использовать перегрузку Transform (), которая принимает аргумент TextWriter .

В противном случае вы могли бы просто писать напрямую в поток (без указания какого-либо XmlWriter).

Или создайте XmlWriter , используя соответствующие XmlWriterSettings (укажите ConformanceLevel.Fragment или ConformanceLevel.Auto).

Или, если преобразование XSLT должно создать документ XML - отладьте и исправьте его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...