XmlResolver: ошибка компилятора XSLT - PullRequest
3 голосов
/ 21 июня 2011

У меня проблемы с классом XmlResolver.У меня есть несколько файлов XSLT, сохраненных в базе данных MS SQL в столбце типа данных xml.Я пытаюсь написать реализацию класса XmlResolver, которая бы загружала текст из базы данных, а не из файлов.Но я получаю ошибку компилятора XSLT.Вот очень простой пример (текст ввода и xslt здесь жестко запрограммирован):

    static void Main(string[] args)
    {
        string xslt = @"<?xml version=""1.0"" encoding=""utf-8""?>
<xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform""     xmlns:msxsl=""urn:schemas-microsoft-com:xslt"" exclude-result-prefixes=""msxsl"" >
<xsl:import href=""test.xslt"" />
<xsl:output method=""xml"" indent=""yes""/>
<xsl:template match=""*"">
    <xsl:value-of select=""$MyVariable""/>
</xsl:template>
</xsl:stylesheet>";
        XDocument transformationInput = XDocument.Parse("<test />");
        myResolv res = new myResolv();
        XslCompiledTransform transform = new XslCompiledTransform(true);
        XsltSettings sett = new XsltSettings(true, true);
        StringReader transr = new StringReader(xslt);
        XmlReader tranReader = XmlReader.Create(transr); 
        transform.Load(tranReader, sett, res);
    }
}

А вот очень простой класс XmlResolver:

class myResolv : XmlResolver
{
    public override Uri ResolveUri(Uri baseUri, string relativeUri)
    {
        return base.ResolveUri(baseUri, relativeUri);
    }

    public override System.Net.ICredentials Credentials
    {
        set { throw new NotImplementedException(); }
    }

    public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn)
    {
        string fileName = System.IO.Path.GetFileName(absoluteUri.ToString());
        if (fileName == "test.xslt")
        {
            string newXslt = @"<?xml version=""1.0"" encoding=""utf-8""?>
<xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform""     xmlns:msxsl=""urn:schemas-microsoft-com:xslt"" exclude-result-prefixes=""msxsl"" >
<xsl:variable name=""MyVariable"" select=""1"" />
  </xsl:stylesheet>";
            StringReader read = new StringReader(newXslt);
            XmlReader xmlread = XmlReader.Create(read);
            return xmlread;
        }
        else
            throw new NotImplementedException();
    }
}

Сбой выполнения в Transform.Loadстрока (Ошибка компилятора XSLT).При чтении преобразования из файла, резолвер работает нормально.Но я не хочу читать это из файла.Спасибо, Петр

1 Ответ

2 голосов
/ 21 июня 2011

Проблема в том, что base-uri используется для связи каждого файла (через XmlReader.BaseUri).Исправление к счастью просто;в GetEntity:

XmlReader xmlread = XmlReader.Create(read, null, fileName);

Обратите внимание, что это означает, что логическое имя объекта (для относительного разрешения) теперь test.xslt.В вашем случае это нормально, но если бы в пути использовалась структура папок, вам нужно быть осторожным, чтобы убедиться, что они относительно / укоренены правильно.

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