Расширение.NET xslt Объект не найден
Я пытаюсь реализовать объект расширения.NET xslt для проверки наличия файла XML, следуя примерам здесь и там. Я также обдумывал некоторые связанные с этим посты, которые не сильно помогли.
Когда я пытаюсь найти расширение с помощью следующего фрагмента кода, отображается сообщение "Функция расширения недоступна":
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:XsltExtensionObject="urn:XsltExtensionObject"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="msxsl XsltExtensionObject">
...
<xsl:choose>
<xsl:when test="function-available('XsltExtensionObject:getFile')">
Extension function is available
</xsl:when>
<xsl:otherwise>
Extension function is not available
</xsl:otherwise>
</xsl:choose>
...
Я создал отдельную библиотеку классов с именем XsltExtensionObject в том же решении VS 2012, как показано ниже (сделал это в VB, чтобы соответствовать первому примеру):
Public Class FileExist
Private exist As Boolean
Public Sub New()
exist = False
End Sub
Public Function getFile(ByVal myFile As String) As Boolean
exist = System.IO.File.Exists(myFile)
Return exist
End Function
End Class
Я выполняю преобразование xsl следующим образом:
protected void Page_Load(object sender, EventArgs e)
{
XmlDocument xmldoc = new XmlDocument();
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load(MapPath("homepage.xslt"));
XsltArgumentList xslArgs = new XsltArgumentList();
XsltExtensionObject.FileExist obj = new XsltExtensionObject.FileExist();
xslArgs.AddExtensionObject("urn:XsltExtensionObject", obj);
xmldoc.Load(MapPath("lists.xml"));
StringWriter sw = new StringWriter();
xslt.Transform(new XmlNodeReader(xmldoc), null, sw);
content.InnerHtml = sw.ToString();
}
Почему он не может найти расширение? Что мне здесь не хватает? Ссылка на сборку?
1 ответ
Есть два момента, которые я хотел бы представить другим, сбитым с толку объектными расширениями Xslt. Во-первых, когда я открыл документ XML с использованием XPathDocument, а не XmlDocument, как показано в этом примере, была обнаружена функция расширения.
Во-вторых, класс, содержащий расширение (FileExist выше), НЕ нужно создавать как библиотеку классов. Вот код C#, который работал:
protected void Page_Load(object sender, EventArgs e)
{
XPathDocument xmldoc = new XPathDocument(MapPath("lists.xml"));
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load(MapPath("homepage.xslt"));
XsltArgumentList xslArgs = new XsltArgumentList();
FileExist obj = new FileExist();
xslArgs.AddExtensionObject("urn:XsltExtensionObject", obj);
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
settings.ConformanceLevel = ConformanceLevel.Fragment;
settings.CloseOutput = false;
using (var sw = new StringWriter())
{
using (var xw = XmlWriter.Create(sw, settings))
{
xslt.Transform(xmldoc, xslArgs, xw, null);
}
content.InnerHtml = sw.ToString();
}
}
public class FileExist
{
bool exist = false;
public bool getFile(string myFile)
{
exist = File.Exists(HttpContext.Current.Server.MapPath(myFile));
return exist;
}
}