xml
  • xslt
  • apostrophe
  • 2014-01-22 54 views 1 likes 
    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; ")' /> 
    

    但它没有工作,其结果是CA”安永一些消除人物!!!!

    有没有想法?

    谢谢

    回答

    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

    ,实际的字符是一个撇号还是一个正确的单引号? –

    相关问题