【问题标题】:Unable to find source for user defined functions in XSL无法在 XSL 中找到用户定义函数的源代码
【发布时间】:2021-01-02 07:40:12
【问题描述】:

我继承了对使用 xslt 转换某些 xml 的进程的支持。我一直在尝试寻找一种在本地进行调试的方法,但我似乎对一些无法找到来源的自定义函数感到困惑。

xsl 中的命名空间定义如下:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" 
xmlns:msxsl="urn:schemas-microsoft-com:xslt"  
xmlns:user="urn:transformFunctions">

在 xsl 中,来自该命名空间的函数被引用如下:

<xsl:value-of select="user:PadString(TransactionHeader/SalesId,20,'padRight')"

在尝试本地调试时,我只得到空白输出。如果我删除函数调用并只选择 TransactionHeader/SalesId,我会按预期获得数据。该过程在生产中运行时运行良好,因此我知道这些功能可以正常工作。

我对使用 xslt 很陌生,所以如果这是一个基本问题,请原谅。这些函数没有在 xsl 本身的任何地方定义,那么它们在哪里定义以便我可以在本地调试时使用它们?

【问题讨论】:

  • 那么您使用哪种 XSLT 处理器,如何运行它?如果函数没有在 XSLT 中定义,那么答案是这些函数可能设置为处理器 API 的扩展函数,并且 XSLT 不是要更改或检查的部分,而是运行转换的代码。
  • 在本地测试期间,我只是使用 Chrome 浏览器进行测试。据我了解,只要 xml 有 xsl 的引用,那么所有现代浏览器都应该应用这些转换。在生产环境中,它在 Azure 函数中运行,但在该函数中的其他任何地方都没有定义自定义用户函数(我可以看到)
  • “现代”浏览器倾向于从 1999 年开始支持 XSLT 1.0 版,并且只支持 XSLT 处理器特定的方式来定义扩展函数,xmlns:msxsl="urn:schemas-microsoft-com:xslt" 的使用建议用于带有 JScript 或 VBScript 的 MSXML 或者可能对于带有 C# 或 JScript 的 .NET。但浏览器不支持,除了 IE。
  • Azure 可能允许使用 XslCompiledTransform API 设置扩展对象和函数,或者提供一些以这种方式设置的预定义函数。
  • 因此使用 .NET 代码 docs.microsoft.com/en-us/dotnet/standard/data/xml/… 是设置要从 XslCompiledTransform 运行的 XSLT 调用的 .NET 代码的相关部分。

标签: xslt azure-functions


【解决方案1】:

Martin 在这里完全正确。在我的例子中,有一个处理 xml 的 Azure 函数。我最初没有注意到的是它正在调用第二个函数,其中繁重的工作正在发生

XslCompiledTransform processor = new XslCompiledTransform();
            StringReader styleSheetReader = new StringReader(xsltStr);
            processor.Load(new XmlTextReader(styleSheetReader), new XsltSettings(), new XmlUrlResolver());
            XsltArgumentList argsList = new XsltArgumentList();
            StringReader sr = new StringReader(inputXML);
            XmlReaderSettings settings = new XmlReaderSettings();
            XmlReader xmlReader = XmlReader.Create(sr, settings);
            
            var flatFile= "";
            argsList.AddExtensionObject("urn:transformFunctions", new XsltFunctions());

【讨论】:

    猜你喜欢
    • 2023-04-09
    • 2020-05-03
    • 1970-01-01
    • 2022-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    相关资源
    最近更新 更多