Как я могу использовать выражение XPath "document ('')" в .NET XsltCompiledTransform? Нужно ли мне? - PullRequest
2 голосов
/ 10 декабря 2010

В настоящее время я работаю над веб-сайтом, на котором мы отправляем XML + XSLT клиентам, которые его поддерживают, для экономии пропускной способности.Однако, если клиент не поддерживает его, мы выполняем преобразование на стороне сервера и отправляем полученный HTML-код.

В моем XSLT я хотел бы использовать XPath, очень похожий на:

document('')//xsl:variable[@name='test']

(чтобы вернуть набор узлов).Это прекрасно работает как в Firefox, так и в IE, но не работает с XsltCompiledTransform - оно говорит мне:

Эта операция не поддерживается для относительного URI.

Похоже, что ошибка происходит в XmlUrlResolver - я знаю, что могу передать пользовательский из них, но кроме этого я не совсем уверен, где мне следует искать.Кто-нибудь может дать мне какие-нибудь советы о том, как я могу заставить это выражение работать?Я с удовольствием использую некоторые расширения MSXSL, если это необходимо - в конце концов, код будет виден только на стороне сервера.

На более общем замечании - распространен ли такой запрос XPath?Я попал в какую-то гигантскую ловушку XSLT, о которой я не знаю?Будет ли что-то сумасшедшее, например медленные веб-браузеры, остановится?

Ответы [ 3 ]

1 голос
/ 10 декабря 2010

Инициируйте преобразование, используя правильно сконструированный экземпляр XsltSettings , так что функция документа допускается .

Вот пример:

// Create the XsltSettings object with the document fn allowed.
XsltSettings settings = new XsltSettings(true,false);

// Create the XslCompiledTransform object and load the style sheet.
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load("sort.xsl", settings, new XmlUrlResolver());

Ваш другой вопрос :

На более общем замечании - распространен ли такой запрос XPath?Я попал в какую-то гигантскую ловушку XSLT, о которой я не знаю?Собирается ли это сделать что-то сумасшедшее, например медленные веб-браузеры, до полной остановки?

Единственная ошибка в том, что это может вызвать повторный анализ таблицы стилей XSLT, и это относительно медленная операция,

Еще более важно то, что вы используете сокращение //, которое почти наверняка вызовет проблемы с производительностью.

Гораздо лучше использовать этот трюк только для глобальных переменных, а затем использовать это выражение:

document('')/*/xsl:variable[@name='test']

Наконец, в случае, если вас не беспокоит потеря переносимости между процессорами XSLT 1.0, более эффективно использовать функцию расширения, зависящую от реализации xxx:node-set(), для преобразования RTF переменной в обычный узел-задавать.Здесь можно использовать exslt:node-set() при условии, что процессор XSLT реализует EXSLT.Это все еще обеспечивает относительно большую степень переносимости, поскольку многие процессоры XSLT, включая XslCompiledTransform, поддерживают exslt:node-set().

1 голос
/ 10 декабря 2010

Мне не удалось найти решение, которое позволило бы мне использовать документ (''), но, поскольку все, что я использую, - это получить переменную для оценки набора узлов, я корректируюXML перед обработкой на стороне сервера, чтобы изменить:

document('')//xsl:variable[@name='test']

на:

msxsl:node-set($test)

Не совсем изящное решение, но оно работает для моих целей.

0 голосов
/ 10 декабря 2010

Вы пробовали использовать

document('')//xsl:variable[@name='test']

?Т.е. использовать строку нулевой длины в качестве аргумента document() вместо передачи без аргументов.Согласно спецификация , document() должна иметь хотя бы один аргумент.Я удивлен, что Firefox и IE слабы в этом.Но это может объяснить, почему XsltCompiledTransform несчастлив.

С другой стороны, если XsltCompiledTransform не будет поддерживать относительный URI, то '' может не работать (это считается относительным URI).Вполне возможно, что, поскольку он компилирует преобразование, неудобно предоставлять доступ к древовидному представлению таблицы стилей.«Процессору XSLT не требуется поддерживать какие-либо конкретные схемы URI. В документации для процессора XSLT должно быть указано, какие схемы URI поддерживает процессор XSLT».

...