Использование RegEx в XSLT

Мне нужно проанализировать автоматически созданную 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 для использования. В нем также обсуждаются другие доступные параметры, демонстрируется использование других доступных функций XPath 1.0 и способы реализации termin-with () как выражения XPath 1.0. Ваше здоровье

Dimitre Novatchev 04.12.2008 20:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
1
6 655
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Эти функции взяты из 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/…

user1228 04.12.2008 17:54

Однако существует 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.

У вас есть два варианта:

  1. Используйте совместимый процессор XSLT 2.0. Если вы предпочитаете оставаться в рамках платформы .NET, тогда подходящий выбор - Saxon.NET

  2. Просто используйте функцию 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') и содержит ().

abatishchev 05.12.2008 00:21

Другие вопросы по теме