2014-01-22 2 views
1

я получил следующее содержание в моем XML:XSLT 1.0 не может перевести апостроф

<MyElement> Cats&amp;apos; eyes </ MyElement > 

Когда я использую следующий код в моем XSLT 1.0:

<xsl:value-of select="MyElement" /> 

Выход

Cats&apos; eyes 

Но я хочу, чтобы получить

Cats’ eyes 

Я попытался

<xsl:value-of select='translate(MyElement, "&amp;apos; ", "&apos; ")' /> 

Но это не сработало, то результат был са»еу с некоторыми устранены символ !!!!

Любые мысли?

Благодаря

ответ

2

Ваша первая проблема заключается в том, что она появится ваш контент был «двойной убежали». Объектом для апострофа является &apos;, а не &amp;apos;.

Ваша попытка заменить символы translate() не работает, потому что работает иначе, чем вы ожидаете. Это не метод поиска/замены. Вы указываете список символов во втором аргументе, а затем соответствующий символ для перевода каждого из них в третий параметр. Если в списке символов в третьем параметре нет соответствующего символа, он будет удален.

Для выполнения замены символа вам необходимо использовать recursive template.

Например:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="/"> 
     <xsl:call-template name="replace-string"> 
      <xsl:with-param name="text" select="MyElement"/> 
      <xsl:with-param name="replace" select="'&amp;apos;'"/> 
      <xsl:with-param name="with" select='"&apos;"'/> 
     </xsl:call-template> 
    </xsl:template> 

    <xsl:template name="replace-string"> 
     <xsl:param name="text"/> 
     <xsl:param name="replace"/> 
     <xsl:param name="with"/> 
     <xsl:choose> 
      <xsl:when test="contains($text,$replace)"> 
       <xsl:value-of select="substring-before($text,$replace)"/> 
       <xsl:value-of select="$with"/> 
       <xsl:call-template name="replace-string"> 
        <xsl:with-param name="text" 
         select="substring-after($text,$replace)"/> 
        <xsl:with-param name="replace" select="$replace"/> 
        <xsl:with-param name="with" select="$with"/> 
       </xsl:call-template> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="$text"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 

Конечно, с помощью XSLT 2.0 вы можете использовать только replace() функцию:

<xsl:sequence select='replace(MyElement, "&amp;apos;", "&apos;")'/> 
0

Это просто, просто добавьте disable-output-escaping="yes"

<xsl:value-of select="MyElement" disable-output-escaping="yes"/> 
+0

И что делать Вы получаете? –

+0

aw, поспешно сделано. Я просто скопировал и вставил его пример, и я все еще получаю текстовый узел ввода (а не тот результат, который он запрашивает). Простите за это. –

+0

Кстати, является ли фактический персонаж апострофом или правой одиночной цитатой? –

Смежные вопросы