Не удается найти сценарий или объект расширения, связанный с пространством имен http://schemas.microsoft.com/office/infopath/2003/xslt/xDocument

Я пытаюсь XSLT преобразовать документ InfoPath из XML в HTML и получаю следующую ошибку:

Cannot find a script or an extension object associated with namespace 'http://schemas.microsoft.com/office/infopath/2003/xslt/xDocument'.

Можно ли вообще преобразовать документ? Я заметил, что XSL использует такие функции, как xdXDocument:GetDOM, которые выглядят как старый синтаксис MSXML. Можете ли вы добавить поддержку MSXML во время преобразования?

Для справки пространство имен:

xmlns:xdXDocument="http://schemas.microsoft.com/office/infopath/2003/xslt/xDocument" 

В этой статье предлагается что вы просто используете представление для печати документа InfoPath - но я думаю, что это может быть уникальным для InfoPath 2007 (после 2010 г. кажется, что вы можете распечатать любое представление).


Кстати, я также пробовал использовать MSXML и получил аналогичную ошибку:

Namespace 'http://schemas.microsoft.com/office/infopath/2003/xslt/xDocument' does not contain any functions.

Вот мой код MSXML:

var xml = new MSXML2.DOMDocument60();
xml.load(txtXmlFilePath.Text);
var lines = File.ReadAllLines(txtXslFilePath.Text);

// Seemingly need to strip out first <?xml... /> line to work
string sXsl = string.Join("\n", lines.Skip(1).ToArray());

var xsl = new MSXML2.DOMDocument60();
xsl.loadXML(sXsl);

string html = xml.transformNode(xsl);

Итак, остается основной вопрос - как преобразовать XSLT-преобразование в документ InfoPath?


person PeterX    schedule 17.05.2013    source источник


Ответы (1)


xdXDocument:GetDOM() - это функция расширения, которая используется для доступа к данным из вторичных источников данных в InfoPath. Я работал с задачей использования XSLT представления InfoPath для преобразования XML-документов InfoPath в HTML, и единственный известный мне способ обработки этих функций расширения - это написать объекты расширения, которые их реализуют (вы можете реализовать фиктивные объекты расширения, которые просто возвращают пустые наборы узлов для этих функций, если они вам не нужны.

Альтернативой является создание представления, не имеющего ссылок на вторичные источники данных формы.

person JLRishe    schedule 17.05.2013
comment
У вас есть информация о создании объектов расширения? - person PeterX; 17.05.2013
comment
Я предполагаю, что вы используете .NET, и если да, то я думаю, что на MSDN есть несколько статей об этом. Вот один: support.microsoft.com/kb/321702 - person JLRishe; 17.05.2013
comment
Спасибо, похоже, ключевая строка - xsltArgList.AddExtensionObject("urn:XYZ", XYZ). - person PeterX; 17.05.2013
comment
Да это правильно. Еще одна вещь, на которую следует обратить внимание, - это то, что существует также функция xdXDocument:get-DOM(), которая используется для ссылки на основной источник данных, когда текущий контекст является вторичным источником данных. Ограничением C # является то, что имена методов не могут содержать дефисы, поэтому я нашел единственный обходной путь - выполнить поиск-замену строки в XSLT для замены xdXDocument:get-DOM(). - person JLRishe; 17.05.2013
comment
Вы знаете, как заставить его обрабатывать ‹xsl: if test = function-available ('xdImage: getImageUrl')›? - person PeterX; 23.10.2013
comment
AFAIK, XSLT-процессор должен обрабатывать function-available() автоматически. У вас были проблемы с этим? - person JLRishe; 23.10.2013
comment
В соответствии с этим образцом, вы используете классы XPathDocument и XslTransform? Я пытаюсь сгенерировать изображения HTML и установить их URL-адреса, но кажется, что function-available() пропускает последующие вызовы xdImage:getImageUrl. Любые примеры кода, которыми вы можете поделиться, были бы очень полезны. - person PeterX; 24.10.2013
comment
XslTransform устарел. Вам следует использовать XslCompiledTransform. Не уверен, что это изменит ситуацию, но вполне возможно. Я полагаю, вы определили функцию getImageUrl в правильном пространстве имен? - person JLRishe; 24.10.2013
comment
Вы можете привести мне пример использования пространства имен? - person PeterX; 25.10.2013
comment
Извините, вы правы, function-available() работает, если вы все поняли правильно. Мне пришлось использовать xsltArgList.AddExtensionObject("http://schemas.microsoft.com/office/infopath/2003/xslt/xImage", xslImageExtension);, чтобы заставить его работать (обратите внимание на полный URI). Я нашел здесь полезную информацию (но, к сожалению, не образец): msdn.microsoft.com /en-us/library/ms950776.aspx - person PeterX; 25.10.2013