【发布时间】: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