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

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

4 голосов
/ 04 декабря 2008

Мне нужно проанализировать автоматически сгенерированную документацию XML для создания отчета. Я решил использовать XSLT, но я очень новичок в этом и нуждаюсь в помощи. Общий шаблон:

<doc>
  <members>
    <member name="F:MyNamespace">
      <summary>Some text</summary>
    </member> 
  </members>
</doc>

Я хочу выделить членов с именем, которое начинается с некоторого слова, например, P: Interfaces.Core. Я решил использовать RegExp в операторе выбора.

<?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>

Почему я получаю ошибку:

Пространство имен http://www.w3.org/TR/xpath-functions не содержит никаких функций>

Где я не прав? Я нашел такой код в примерах, в том числе w3c.org!

Ответы [ 4 ]

8 голосов
/ 04 декабря 2008

Если вы выполняете преобразование с помощью 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.0 starts-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 (с1, string-length (с1) - string-length (с2) +1) = с2

, где «===» означает «эквивалентно».

Здесь мы также использовали функции XPath 1.0 substring() и string-length().

2 голосов
/ 04 декабря 2008

Если вы работаете исключительно в MS XML, вы можете добавить пользовательские функции, написанные на языке .net по вашему выбору. Смотрите пример на MSDN (они используют JScript). Тогда вы можете использовать регулярные выражения.

Однако вы должны иметь возможность использовать start-with xslt, чтобы делать то, что вам нужно.

0 голосов
/ 04 декабря 2008

Однако есть функция outofjail.get () с .net: всегда есть возможность передать задачу в объект расширения .

Не очень хорошая практика, так как это расширение XSLT, но иногда вам приходится идти с тем, что работает.

0 голосов
/ 04 декабря 2008

Эти функции взяты из XPath 2.0 в XSLT 2.0. .NET XSLT равен 1.0, и ваше пространство имен xsl отражает это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...