xslt fn: замена не работает должным образом - PullRequest
2 голосов
/ 09 июня 2011

я пытаюсь заменить строку location на tocation, так что в основном это мой код:

<div id="{fn:replace('location','l','t')}">

но вместо того, чтобы дать мне tocation, это дает мне t?!

Live Пример: перейти к http://www.w3schools.com/xsl/tryxslt.asp?xmlfile=cdcatalog&xsltfile=cdcatalog_ex1 Во втором текстовом поле введите этот код и нажмите кнопку Edit and Click Me:

<?xml version="2.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
  <div>
    <xsl:value-of select="fn:replace('location','l','t')"/>
  </div>
</xsl:template>
</xsl:stylesheet>

1 Ответ

3 голосов
/ 09 июня 2011

Я не могу воспроизвести сообщенную проблему .

Когда я выполняю это преобразование, используя Saxon 9.1.05 и XQSharp:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  <div id="{replace('location','l','t')}"/>
 </xsl:template>
</xsl:stylesheet>

для любого XML-документа (не используется) результат в обоих случаях является ожидаемым, правильным :

<div xmlns:xs="http://www.w3.org/2001/XMLSchema" id="tocation"/>

Это означает, что вы используете несовместимый / глючный XSLT 2.0процессор .

Свяжитесь с поставщиком и сообщите об ошибке.

Если вы используете процессор XSLT 1.0 , вам нужно написать рекурсивный именованный шаблонсделать простую замену (не используя RegExes).В теге "xslt" есть несколько хороших примеров, которые можно найти в ответах на подобные вопросы.

Однако конкретное изменение, которое вы хотите выполнить, может быть сделано еще проще:

<div id="{translate('location','l','t')}"/>
...