XSLT 1.0 не может переводить апостроф

У меня есть следующий контент в моем XML:

<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; ")'  />

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

Любая мысль?

Спасибо


person Azi    schedule 22.01.2014    source источник


Ответы (2)


Ваша первая проблема заключается в том, что кажется, что ваш контент был "двойным экранированием". Сущность для апострофа — &apos;, а не &amp;apos;.

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

Вам нужно будет использовать рекурсивный шаблон для выполнения замены символов.

Например:

<?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()< /strong> функция:

<xsl:sequence select='replace(MyElement, "&amp;apos;", "&apos;")'/>
person Mads Hansen    schedule 22.01.2014

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

<xsl:value-of select="MyElement" disable-output-escaping="yes"/>
person Joel M. Lamsen    schedule 22.01.2014
comment
ой, наспех сделано. Я просто скопировал и вставил его пример, и я все еще получаю текстовый узел ввода (а не вывод, на который он претендует). Простите за это. - person Joel M. Lamsen; 22.01.2014
comment
кстати, фактический символ - это апостроф или правильная одинарная кавычка? - person Joel M. Lamsen; 22.01.2014