2013-04-26 91 views
1

使用xsltproc(XSLT 1.0)我試圖從xsl-value @name屬性中轉義(「 - >轉換爲\」)內容。使用xsltproc轉義XML屬性的值

XSL:

<xsl:template match="int:signature"> 
    "name":"<xsl:value-of select="@name" mode="text"/>", 
    .... 

原始XML:

<signature name="My &quot;case&quot;" /> 

輸出:

"name":"My "case"", 

打破導致JSON

我使用海峽的嘗試:取代沒有成功。 disable-output-escaping =「yes」也沒有成功。

任何提示?

-

xsltproc的-V

使用的libxml 20706,10126的libxslt和libexslt 815

+0

請與您的預期產出增加一個例子(也許輸入):喊這是'「name」:「xxxxx」或「\」name「:\」xxxxx \「'。還是應該改變'@ name'的內容? – 2013-04-26 15:24:12

+0

我改進了一些解釋。是的,@name的內容應該被改變(被轉義)。 – 2013-04-26 15:51:42

+0

xslt 1.0的一種可能性是使用遞歸模板調用來轉義引號。但是,將這個外向變量改爲撇號還不夠嗎? ''name':'我的'case'','(這應該是有效的jason) – 2013-04-26 16:49:32

回答

0

如果你需要逃避這樣的事情將有助於

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 
    <xsl:template match ="signature"> 
     <xsl:variable name="escape"> 
      <xsl:call-template name="escape_quot"> 
       <xsl:with-param name="replace" select="@name"/> 
      </xsl:call-template> 
     </xsl:variable> 
     "name":"<xsl:value-of select="$escape" />", 
    </xsl:template> 

    <xsl:template name="escape_quot"> 
     <xsl:param name="replace"/> 
     <xsl:choose> 
      <xsl:when test="contains($replace,'&quot;')"> 
       <xsl:value-of select="substring-before($replace,'&quot;')"/> 
       <!-- escape quot--> 
       <xsl:text>\"</xsl:text> 
       <xsl:call-template name="escape_quot"> 
        <xsl:with-param name="replace" select="substring-after($replace,'&quot;')"/> 
       </xsl:call-template> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="$replace"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 

這將生成wonted輸出。

"name":"My \"case\"", 

更新:
然而這不足以向外QUOT更改爲單引號。

有:

"name":'<xsl:value-of select="@name" />', 

獲得:

"name":'My "case"', 

(這應該是有效的JSON)

+0

這工作。謝謝! – 2013-04-26 17:20:16

+0

很高興我能幫到你。看看更新。 – 2013-04-26 17:24:34

+0

如果我更改爲「名稱」:'..'我想我需要關心'而不是'我猜,因爲一些參數值可能包含該字符。 – 2013-04-26 17:32:36

0

這個工程使用XPath 2.0

"name":"<xsl:value-of select='fn:replace(@name, """", "\\""")' />" 

xsltproc的不支持的XPath 2.0作爲據我所知,但也許EXSLT擴展提供相同的功能

+0

xsltproc:\t'「name」:「「,'我得到這個錯誤:'XPath錯誤:無效表達 str:replace錯誤:文件interproscan。xsl第132行元素值爲 xsl:value-of:無法編譯選擇表達式str:replace(@name,「」「,」「\\」「」)「' – 2013-04-26 16:49:32

+0

我使用了saxon(2.0樣式表)它工作 – 2013-04-26 17:21:50