Использование функции XPath fn: replace from XSLT - PullRequest
7 голосов
/ 02 февраля 2010

Я пытаюсь использовать XSLT для преобразования простой XML-схемы в HTML и планировал использовать fn:replace для замены возвратов (\n) на <p>;. Однако я не могу понять, как правильно использовать эту функцию.

Упрощенная версия XSLT, которую я использую, читает:

<?xml version="1.0"?>

<xsl:stylesheet version="1.0" 
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                xmlns:fn="http://www.w3.org/2005/xpath-functions">
  <xsl:template match="/root">
    <html>
      <body>
        <!-- Replace \n with <p> -->
        <xsl:value-of select="fn:replace(value, '\n', '<p>')" />
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

И вход для этого XLST, например, ::1009*

<?xml version="1.0"?>

<root>
  <value><![CDATA[
    Hello
    world!
  ]]></value>
</root>

Преобразование не выполняется fn:replace с исключением NoSuchMethodException. Если я заменю оператор замены на

<xsl:value-of select="fn:replace('somestring', '\n', '<p>')" />

Я получаю исключение IllegalArgumentException. Как мне использовать fn:replace для достижения того, чего я хочу?

Я использую Butterfly XML Editor для проверки XSLT.

Ответы [ 2 ]

7 голосов
/ 02 февраля 2010

XPath 2.0 имеет функцию замены, которую вы можете использовать с любым процессором XSLT 2.0, таким как Saxon 9, инструменты AltovaXML или Gestalt. Похоже, вы пытаетесь использовать функцию с процессором XSLT 1.0, которая не будет работать. Если вы ограничены процессором XSLT 1.0, вам нужно будет выполнить замену с помощью именованного рекурсивного шаблона или с помощью расширения.

Однако обратите внимание, что даже в XSLT 2.0 ваша попытка использовать замену кажется неправильной, поскольку вы создадите текстовый узел с разметкой тега 'p', в то время как я предполагаю, что вы хотите создать узел элемента 'p' в результате. Таким образом, даже при использовании XSLT 2.0 использование анализ-строки вместо замены с большей вероятностью даст желаемый результат.

0 голосов
/ 04 ноября 2012

Увеличивая атрибут версии <xsl:stylesheet> до 2.0 и используя

<xsl:value-of select="replace(description, '\n', '<p/>')" disable-output-escaping="yes" />

Мне удалось заставить работать замену.

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