2013-10-03 2 views
0

Я использую версию .net Saxon-HE.Как использовать функцию XSLT fn: document в Saxon-HE для чтения строки XML?

Я написал код для настройки преобразования XSLT, где исходный XSLT передается извне (не читается из файла во время выполнения).

Вот отрывок из моего кода:

Saxon.Api.Processor processor = new Saxon.Api.Processor(); 

// Feed the XSLT into Saxon 
XmlDocument document = new XmlDocument(); 
document.LoadXml(xslt); 
Saxon.Api.XdmNode input = processor.NewDocumentBuilder().Build(document); 
Saxon.Api.XsltCompiler xsltCompiler = processor.NewXsltCompiler(); 
Saxon.Api.XsltExecutable xsltExecutable = xsltCompiler.Compile(input); 
Saxon.Api.XsltTransformer xsltTransformer = xsltExecutable.Load(); 

// Create The stream that will contain the transformed XML. 
MemoryStream transformedXmlStream = new MemoryStream(); 
xsltTransformer.InputXmlResolver = null; 
// Input the XML into the transformer. 
xsltTransformer.InitialContextNode = processor.NewDocumentBuilder().Build(inputXml); 
// Set up the serializer that will output the result. 
Saxon.Api.Serializer dataSerializer = processor.NewSerializer(transformedXmlStream); 
// Run the transformation and get the output as a stream. 
xsltTransformer.Run(dataSerializer); 

Этот код прекрасно работает до сих пор!

Однако у меня возникла проблема с новым требованием. Мне было предложено реализовать некоторые функции, используя функцию document(), которая требует другого документа XML с собственным BaseURI.

Этот другой документ будет передаваться непосредственно в программу как строка или поток, так же как XSLT и входной XML. Проблема в том, что я в тупике выясняю, как подать в документе саксон, на который будет ссылаться функция document().

Как использовать функцию document() для чтения XML-потока в Saxon XSLT?

+0

связано? http://stackoverflow.com/questions/6422087/xmlresolver-xslt-compiler-error –

ответ

1

Установите свойство InputXmlResolver xsltTransformer в XmlResolver, который распознает URI, переданный функции document(), и возвращает соответствующий входной поток.

+0

Спасибо. Это работает! У меня этот код работает в цикле, так что он преобразует многие XML-документы. Я заметил, что мой код «XmlResolver» вызывается только один раз (это хорошо!), Что заставило меня задуматься о том, какое время жизни принадлежит данным, полученным Саксоном из моего «XmlResolver». –

+1

Спецификация XSLT требует, чтобы несколько вызовов документа() с тем же URI возвращали один и тот же документ. Поэтому перед вызовом резольвера Саксон проверяет, видел ли он этот URI раньше. Документы сохраняются в пуле документов, принадлежащем контроллеру (= ​​JAXP Transformer), и если вы явно не отбрасываете их, они сохраняются в течение срока действия контроллера. –

+1

Еще раз спасибо за информацию. Эта саксонская библиотека позволяет мне создать гораздо лучшее решение для моего клиента по сравнению с тем, что я застрял с классами .net XSLT, которые поддерживают только XSLT 1.0. –

Смежные вопросы