Не удается найти источник для пользовательских функций в XSL

#xslt #azure-functions

#xslt #azure-функции

Вопрос:

Я унаследовал поддержку процесса, который преобразует некоторый XML с использованием xslt. Я пытался найти способ локальной отладки, но, похоже, я зациклился на некоторых пользовательских функциях, источник которых я не могу найти.

Пространства имен в 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, так где же они определены, чтобы я мог использовать их при локальной отладке?

Комментарии:

1. Итак, какой процессор XSLT вы используете, как вы его запускаете? Если функции не определены в XSLT, то ответ заключается в том, что функции, вероятно, настроены как функции расширения с помощью API процессора, и XSLT не является частью, подлежащей изменению или проверке, это код, выполняющий преобразование.

2. Во время моего локального тестирования я просто использую браузер Chrome для тестирования. Насколько я понял, пока xml имеет ссылку на xsl, все современные браузеры должны применять преобразования. В производственной среде он выполняется в функции Azure, но, опять же, нигде больше в этих функциях не определены пользовательские функции пользователя (которые я вижу)

3. «Современные» браузеры, как правило, поддерживают версию 1.0 XSLT от 1999 года, которая поддерживает только специфические для процессора XSLT способы определения функций расширения. Использование xmlns:msxsl="urn:schemas-microsoft-com:xslt" предлагает использовать MSXML с JScript или VBScript или, возможно, для .NET с C # или JScript. Но браузеры не поддерживают это, кроме IE.

4. Azure, вероятно, позволяет настраивать объекты расширения и функции с помощью XslCompiledTransform API или предоставляет некоторые предопределенные функции, настроенные таким образом.

5. Так что с . ЧИСТЫЙ код learn.microsoft.com/en-us/dotnet/standard/data/xml /… является соответствующим разделом для настройки .NET-кода, который будет вызываться из XSLT, запускаемого с помощью XslCompiledTransform.

Ответ №1:

Мартин был полностью прав здесь. В моем случае была функция Azure, обрабатывающая обработку xml. Чего я изначально не заметил, так это того, что он вызывал вторую функцию, в которой происходил тяжелый подъем

 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());