XSL: использование внешних функций VB с XSL - PullRequest
0 голосов
/ 29 октября 2009

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

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

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

XMLNS: MyLib = "урна: extnlib.dll"

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

1 Ответ

2 голосов
/ 16 ноября 2009

Вам необходимо передать расширение, используя 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...