1

我正在尝试实现一个 .NET xslt 扩展对象,以检查是否存在以下示例中xml文件。我还思考了一些没有太大帮助的相关 SO 帖子。

当我尝试使用以下代码片段查找扩展时,它显示“扩展功能不可用”:

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

...

我在相同的 VS 2012 解决方案中创建了一个名为 XsltExtensionObject 的单独类库,如下所示(在 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();
    }

为什么找不到扩展名?我在这里想念什么?装配参考?

4

1 回答 1

0

我想向其他对 Xslt 对象扩展感到困惑的人介绍两点。首先,当我使用 XPathDocument 而不是 XmlDocument 打开 xml 文档时,如本示例所示,找到了扩展函数。

其次,不需要将包含扩展名的类(上面的 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;
        }
    }
于 2013-08-22T01:38:38.423 回答