2017-01-24 6 views
0

У меня есть файл XSLT в # проекта C так:Вызов C# функция в XSLT саксонскими

<msxsl:script language="C#" implements-prefix="user"> 

    <![CDATA[ 
    public string Test() 
    {   
     return "test1"; 
    } 
    ]]> 

</msxsl:script> 

... 

<xsl:value-of select="user:Test()"/> 

я трансформировал свой файл XML с помощью этого XSLT, как это:

//Enable execute C# function in xslt 
var Xsltsettings = new XsltSettings(); 
Xsltsettings.EnableScript = true; 

XslCompiledTransform xsl = new XslCompiledTransform(); 
xsl.Load(XslFile, Xsltsettings, new XmlUrlResolver()); 

// get transformed results 
StringWriter sw = new StringWriter(); 
XsltArgumentList xslarg = new XsltArgumentList(); 
xsl.Transform(xdoc, xslarg, sw); 
sw.Close(); 

я стараюсь использовать с XSLT 2.0 на saxon9he-апи как это:

Processor processor = new Processor(); 

// Load the source document. 
string sourceUri = @"D:\testXML.xml"; 
XdmNode input = processor.NewDocumentBuilder().Build(new Uri(sourceUri)); 

// Create a transformer for the stylesheet. 
string xsltUri = @"D:\testXSLT.xslt"; 
XsltTransformer transformer = processor.NewXsltCompiler().Compile(new Uri(xsltUri)).Load(); 

// Set the root node of the source document to be the initial context node. 
transformer.InitialContextNode = input; 

Serializer serializer = new Serializer(); 
StringBuilder sb = new StringBuilder(); 
TextWriter writer = new StringWriter(sb); 
serializer.SetOutputWriter(writer); 

transformer.Run(serializer); //Error line 

Но этот код имеет ошибку ниже:

Не удается найти соответствующую функцию 0-аргумента с именем {урна: мои-скрипты} Test()

Я прочитал много поста, но я не нашел решение для решения этой проблемы.

Было бы очень полезно, если бы кто-нибудь мог объяснить решение этой проблемы.

ответ

2

Saxon не поддерживает проприетарные расширения Microsoft. Расширения XSLT обычно не переносимы между процессорами разных типов.

Вы должны переписать существующий, C# -А функция расширения в Java и (см комментариев ниже) переключателя в собственном патентованный механизм расширения саксонского.

Читать

+1

Вам не придется переписать его в Java, Saxon позволяет вызывая расширение функций, написанных на языке C# - см Http: //www.saxonica .com/documentation/index.html #! extensibility/dotnetextensions - но вам нужно использовать соглашения о саксонских вызовах, а не Microsoft. Обратите внимание, что с XSLT 2.0 необходимость в функциях расширения значительно снижается, потому что вы можете делать большинство вещей, которые вам нужны в XSLT/XPath. –

+0

Также обратите внимание, что для механизма «рефлексивных функций расширения» требуется Saxon-PE или выше. –

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