:
IDatabaseService XmlReader. , baseUri; :.
public XmlReader GetApplicationXslt(string applicationName)
{
…
var baseUri = string.Format("db://{0}.hist.org", applicationName);
return XmlReader.Create(input: …,
settings: …,
baseUri: baseUri);
}
, . . , , .
, : :
, :
" XSLT . , XSLT- , ."
, ...
- (
db://…) XmlDbResolver db://IDatabaseService, XmlDbResolver
, , , XmlResolver / IDatabaseService. , - .
mock XmlDbResolver ( ). , , IDatabaseService .
: . . OP .
:
Visual Studio 2010 ( , Gist Git (git clone https://gist.github.com/fbbd5e7319bd6c281c50b4ebb1cee1f9.git), 2- , git checkout d00629). .

( , Copy to output SqlServerDatabase.mdf, TestInput.xml .xslt Always.)
SqlServerDatabase.mdf:
, , SQL Server Express 2008. ( App.config, . .)
:

, :

. (. Program.cs CommonHistOrg.xslt).
App.config:
.
<?xml version="1.0"?>
<configuration>
<connectionStrings>
<add name="SqlServerDatabase"
connectionString="Data Source=.\SQLEXPRESS;
AttachDbFilename=|DataDirectory|\SqlServerDatabase.mdf;
Integrated Security=True;
User Instance=True"
/>
</connectionStrings>
</configuration>
IDatabaseService.cs:
IDatabaseService, .
SqlServerDatabaseService.cs:
, IDatabaseService. / :
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.IO;
using System.Xml;
class SqlServerDatabaseService : IDatabaseService
{
SqlConnection CreateConnection()
{
return new SqlConnection(connectionString: ConfigurationManager.ConnectionStrings["SqlServerDatabase"].ConnectionString);
}
public void StoreApplicationDocument(string applicationName, XmlReader document)
{
using (var connection = CreateConnection())
{
SqlCommand command = connection.CreateCommand();
command.CommandText = "INSERT INTO ApplicationDocuments (ApplicationName, Document) VALUES (@applicationName, @document)";
command.Parameters.Add(new SqlParameter("@applicationName", applicationName));
command.Parameters.Add(new SqlParameter("@document", new SqlXml(document)));
connection.Open();
int numberOfRowsInserted = command.ExecuteNonQuery();
connection.Close();
}
}
public XmlReader GetApplicationXslt(string applicationName)
{
using (var connection = CreateConnection())
{
SqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT Document FROM ApplicationDocuments WHERE ApplicationName = @applicationName";
command.Parameters.Add(new SqlParameter("@applicationName", applicationName));
connection.Open();
var plainXml = (string)command.ExecuteScalar();
connection.Close();
if (plainXml != null)
{
return XmlReader.Create(new StringReader(plainXml));
}
else
{
throw new KeyNotFoundException(message: string.Format("Database does not contain a application document named '{0}'.", applicationName));
}
}
}
…
}
XmlDbResolver.cs:
XmlDbResolver, XmlDbResolver, :
CommonHistOrg.xslt:
db://common.hist.org, (. Program.cs):
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="Foo">
<Bar/>
</xsl:template>
</xsl:stylesheet>
TestStylesheet.xml:
, db://common.hist.org:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="db://common.hist.org"/>
</xsl:stylesheet>
TestInput.xml:
XML-, , TestStylesheet.xslt:
<?xml version="1.0" encoding="utf-8" ?>
<Foo/>
Program.cs:
:
using System;
using System.Text;
using System.Xml;
using System.Xml.Xsl;
class Program
{
static void Main(string[] args)
{
var databaseService = new SqlServerDatabaseService();
databaseService.StoreApplicationDocument(
applicationName: "common",
document: XmlReader.Create("CommonHistOrg.xslt"));
var xslt = new XslCompiledTransform();
xslt.Load(@"TestStylesheet.xslt",
settings: XsltSettings.Default,
stylesheetResolver: new XmlDbResolver(databaseService));
var input = XmlReader.Create("TestInput.xml");
var output = new StringBuilder();
xslt.Transform(input, XmlWriter.Create(output));
Console.WriteLine(output.ToString());
Console.ReadLine();
}
}
: XML- <Bar/>, db://common.hist.org <Foo/> .
: :
Main:
databaseService.StoreApplicationDocument(
applicationName: "test",
document: XmlReader.Create("TestStylesheet.xslt"));
xslt.Load(@"TestStylesheet.xslt", …);
do
xslt.Load(@"db://test.hist.org", …);
, OP.
, .
, Document XML. NTEXT.
, <?xml … ?> , . , XML , SqlServerDatabaseService .
, - .NET Framework. . .NET Framework. ( , 3.5 .) VS .
xslt.Load(…;) Main, LoadStylesheet XsltLoader.cs. a HybridDictionary documentUrisInUse, , -, URI . , URI, null ; .
, URI , IDatabaseService, . , baseUri XmlReader. . . this Gist (git clone https://gist.github.com/fbbd5e7319bd6c281c50b4ebb1cee1f9.git).