2009-10-28 2 views
0

У меня есть визуальный базовый файл с рядом функций, которые я хочу использовать внутри своего XSL. Я могу построить его как dll и ссылку в моем проекте XSL, но я не знаю, как ссылаться на него в моем XSL-файле. Я использую визуальную студию.XSL: Использование внешних функций VB с XSL

я получаю сообщение об ошибке «Не удается найти сценарий или внешний объект, который реализует префикс ...»

Я хочу сделать что-то вроде:

Xmlns: MYLIB = «урна: extnlib.dll»

Кто-нибудь это сделал?

ответ

2

Вам необходимо передать расширение с помощью XsltArgumentList.

В качестве примера:

Dim xmlPath As String : xmlPath = sArgs(0) 
Dim xsltPath As String : xsltPath = sArgs(1) 
Dim dllFileName As String : dllFileName = sArgs(2) 

Dim xsltReader As XmlTextReader = New XmlTextReader(xsltPath) 
Dim xsltDoc As XslCompiledTransform = New XslCompiledTransform() 

xsltDoc.Load(xsltReader, New XsltSettings(), New XmlUrlResolver()) 

Dim xslArg As XsltArgumentList = New XsltArgumentList() 

Dim dll As Assembly = Assembly.LoadFrom(dllFileName) 

For Each objType As Type In dll.GetTypes() 
    If objType.IsPublic Then 
     Dim ext As Object = Activator.CreateInstance(objType) 
     xslArg.AddExtensionObject("urn:" & dllFileName & "#" & objType.Name, ext) 
    End If 
Next 

Dim xpathDoc As XPathDocument = New XPathDocument(New XmlTextReader(xmlPath)) 
Dim outWriter As XmlWriter = XmlWriter.Create(Console.Out) 

xsltDoc.Transform(xpathDoc, xslArg, outWriter) 

outWriter.Flush() 
outWriter.Close() 

Мое расширение находится в XsltExtensions.dll, в течение которого у меня есть:

Public Class Simple 
    Public Function DateFormat(ByVal dateToParse As String, ByVal format As String) As String 
     DateFormat = DateTime.Parse(dateToParse).ToString(format) 
    End Function 
End Class 

Так положить все это вместе:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:my="urn:XsltExtensions.dll#Simple" exclude-result-prefixes="my"> 

<xsl:template match="/"> 
    <root> 
    <xsl:value-of select="my:DateFormat('3/9/2002', 'yyyy-MM-dd')"/> 
    </root> 
    </xsl:template> 
</xsl:stylesheet> 
Смежные вопросы