XQSharp простая проблема преобразования XSLT2 - PullRequest
0 голосов
/ 12 июля 2011

Я пытаюсь получить преобразование xslt2 с помощью XQSharp, но я получаю исключение при попытке вызвать ApplyTemplates.

Мой код:

<WebMethod()>
Public Function test(ByVal inputXml As String, ByVal inputXsl As String) As String
        Dim nameTable As XmlNameTable = New NameTable()

        Dim xmlReaderSettings As New XmlReaderSettings()
        xmlReaderSettings.NameTable = nameTable

        Dim document As XdmDocument

        Using reader As New StringReader(inputXml)
            document = New XdmDocument(reader)
        End Using

        Dim querySettings As New XsltSettings(nameTable)
        querySettings.ContextItemType = XdmType.Node
        querySettings.ModuleResolver = New XmlUrlResolver()

        Dim query As Xslt = Xslt.Compile(New StringReader(inputXsl), 
querySettings)

        Dim contextItem As XPathNavigator = document.CreateNavigator()
        Dim result As Stream = New MemoryStream()
        query.ApplyTemplates(contextItem, result)


        Using reader As StreamReader = New StreamReader(result)
            Return reader.ReadToEnd()
        End Using

End Function

XmlInput:

<?xml version="1.0"?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>hoi</title>
</head>
<body>
    <p>Test</p>
</body>
</html>

XslInput:

<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns="http://www.w3.org/1999/xhtml" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/02/xpath-functions" xmlns:xdt="http://www.w3.org/2005/02/xpath-datatypes" exclude-result-prefixes="xhtml xsl fn xs xdt">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" omit-xml-declaration="yes" indent="yes" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>
</xsl:stylesheet>

Исключение

Исключение System.ArgumentNullException не было обработано кодом пользователя
Сообщение = значение не может быть нулевым.
Имя параметра: формат
ParamName = формат
Источник = mscorlib
StackTrace:
в System.String.Format (поставщик IFormatProvider, формат String, аргументы Object [])
в XQSharp.XdmException.WrongParamNameTable (LineInfo lineInfo, XmlQualifiedName параметрName)
в XQSharp.DocumentSet.ImportParamNode (LineInfo lineInfo, навигатор XPathNavigator, параметр-имя XmlQualifiedName)
в XQSharp.DynamicContext.ConvertArgument (значение IEnumerable`1, LineInfo lineInfo, DocumentSet documentSet, контекст StaticModuleContext, имя XmlQualifiedName, BoundType Объявленный тип)
в XQSharp.DynamicContext..ctor (StaticModuleContext staticContext, DynamicContextSettings параметры, XmlQualifiedName initialMode, XmlQualifiedName initialTemplate, Int32 stackSpace, Int32 globalSpace, IResultDocumentHandler resultDocumentHandler)
в XQSharp.Xslt.Evaluate (XmlQualifiedName initialMode, XmlQualifiedName initialTemplate, параметры DynamicContextSettings, IResultDocumentHandler resultDocumentHandler)
в XQSharp.Xslt.ApplyTemplates (IXPathNavigable contextNode, Stream resultDocument)
в Cmsservices.XSLTEngine.test (String inputXml, String inputXsl) в
D: \ Projecten \ cmsservices \ App_Code \ CmsservicesXSLTEngine.vb: строка 44 InnerException:

Что я делаю не так?

1 Ответ

1 голос
/ 12 июля 2011

Возникла ArgumentNullException, поскольку мы неправильно ссылались на сообщение об ошибке в файле ресурсов. Это было исправлено в следующей версии (2.2).

Проблема в том, что документ составлен с таблицей имен, отличной от запроса.

Проблема заключается в следующих строках вашего исходного кода:

Using reader As New StringReader(inputXml)
    document = New XdmDocument(reader)
End Using

Вы не указываете таблицу имен, которая будет использоваться для создания XdmDocument, и поэтому для документа создается новая таблица имен.

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

Чтобы исправить ваш запрос, вместо этого создайте свой XdmDocument из XmlReader:

Using reader As New StringReader(inputXml)
    Using xmlReader As XmlReader = XmlReader.Create(reader, xmlReaderSettings)
        document = New XdmDocument(xmlReader)
    End Using
End Using
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...