Мне нужно проанализировать автоматически созданную Visual Studio XML-документацию, чтобы создать отчет. Я решил использовать XSLT, но я новичок в этом и нуждаюсь в помощи. Общий шаблон:
<doc>
<members>
<member name = "F:MyNamespace">
<summary>Some text</summary>
</member>
</members>
</doc>
Я хочу изолировать элементы с именем, которое начинается с некоторого слова, например, P: Interfaces.Core. Я решил использовать RegExp в выражении select.
<?xml version = "1.0" encoding = "utf-8"?>
<xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
xmlns:fn = "http://www.w3.org/TR/xpath-functions/">
<xsl:template match = "/" >
<html xmlns = "http://www.w3.org/1999/xhtml">
<body style = "font-family:Tahoma">
<p>Interfaces list:</p>
<table>
<xsl:for-each select = "doc/members/member">
<xsl:sort order = "ascending" />
<xsl:value-of select = "fn:matches(., 'P\..+')" />
<br />
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Почему появляется ошибка:
Namespace http://www.w3.org/TR/xpath-functions does not contain any functions >
Где я не прав? Я нашел такой код в примерах, в том числе на w3c.org!





Эти функции взяты из XPath 2.0 в XSLT 2.0. .NET XSLT имеет версию 1.0, и ваше пространство имен xsl отражает это.
Если вы работаете исключительно в MS XML, вы можете добавлять собственные функции, написанные на языке .net по вашему выбору. См. Пример на MSDN (они используют JScript). Тогда вы можете использовать регулярные выражения.
Однако вы должны иметь возможность использовать функцию xslt начинается с, чтобы делать то, что вам нужно.
Реализация XSLT в MS не поддерживает функции 2.0. Вы должны использовать внешнюю библиотеку XSLT, например Saxon. Подробнее здесь: stackoverflow.com/questions/94047/…
Однако существует outofjail.get () с .net: всегда есть возможность передать задачу Объект расширения.
Это не очень хорошая практика, поскольку это расширение XSLT, но иногда приходится прибегать к тому, что работает.
Если вы выполняете преобразование с помощью Visual Studio X, где X не больше 2008, это будет обрабатываться процессором XSLT 1.0 (.NET XslCompiledTransform или XslTransform). XSLT 1.0 использует XPath 1.0, а не XPath 2.0 и его F&O (функции и операции), который только в прошлом году стал рекомендацией W3.
У вас есть два варианта:
Используйте совместимый процессор XSLT 2.0. Если вы предпочитаете оставаться в рамках платформы .NET, тогда подходящий выбор - Saxon.NET
Просто используйте функцию XPath 1.0starts-with(), которого достаточно для решения текущей проблемы.
Выражение: starts-with(., 'P:Interfaces') оценивается как true(), если строковое значение узла контекста начинается со строки 'P: Interfaces', и как false() в противном случае.
Еще одна функция Xpath 1.0, которая может пригодиться для такого типа обработки, - это функция contains().
Функция Xpath 2.0 ends-with() может быть эмулирована в XPath 1.0 следующим образом:
ends-with(s1, s2) ==== substring (s1, string-length (s1) -string-length (s2) +1) = s2
где «===» означает «эквивалентно».
Здесь мы также использовали функции XPath 1.0 substring() и string-length().
Привет! Большое спасибо за ответ! Я уже сделал что-то вроде того, о чем вы говорите - я имею в виду XPath 1.0, я использую именно то, что вы сказали - начинается с (@name, 'T: MyNamespaces.Interfaces') и содержит ().
Абатищев, смотри мой ответ. Из всех ответов на данный момент только этот предоставляет вам точное выражение XPath для использования. В нем также обсуждаются другие доступные параметры, демонстрируется использование других доступных функций XPath 1.0 и способы реализации termin-with () как выражения XPath 1.0. Ваше здоровье