2009-10-28 3 views
0

J'ai un fichier de base visuel avec un certain nombre de fonctions que je veux utiliser dans mon XSL. Je peux le construire en tant que DLL et référence dans mon projet XSL mais je ne sais pas comment le référencer dans mon fichier XSL. J'utilise Visual Studio.XSL: Utilisation de fonctions VB externes avec XSL

Je reçois l'erreur "Impossible de trouver le script ou objet externe qui implémente préfixe ..."

Je veux faire quelque chose comme:

xmlns: mylib = "urn: extnlib.dll"

Quelqu'un at-il fait cela?

Répondre

2

Vous devez transmettre l'extension à l'aide de XsltArgumentList.

À titre d'exemple:

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() 

Mon poste est en XsltExtensions.dll, dans lequel j'ai:

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 

donc mettre tous ensemble:

<?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>