2013-01-15 17 views
2

我通過SoapUI發送肥皂請求並使用XSLT生成XML迴應。我的回答必須是這樣的:爲什麼<轉換爲<而>和其他轉義字符適當地轉換

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
<soap:Body> 
    <TXLifeResponse>   
    <TransType tc="1201">General Requirement Order Request</TransType> 
    </TXLifeResponse> 
</soap:Body> 
</soap:Envelope> 

我能夠得到以下XSLT

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:acord="http://ACORD.org/Standards/Life/2" 
    xmlns="http://ACORD.org/Standards/Life/2"> 
    <xsl:output method="xml" encoding="utf-8" indent="yes" /> 
    <xsl:variable name="TransType_tc" select="//acord:TXLife/acord:TXLifeRequest//acord:TransType/@tc" /> 
    <xsl:variable name="TransType" select="//acord:TXLife/acord:TXLifeRequest//acord:TransType" /> 

    <xsl:template match="/">  
     <TXLifeResponse>  
      <xsl:element name="TransType"> 
      <xsl:attribute name="tc"><xsl:value-of select="$TransType_tc"/></xsl:attribute> 
      <xsl:value-of select="$TransType"/> 
      </xsl:element> 
     </TXLifeResponse> 
    </xsl:template> 
</xsl:stylesheet> 

從這個反應,但我注意到一個意外的行爲。使用<xsl:element<xsl:attribute>標籤之前,我的確在XSLT是這樣的:

&lt;TransType tc=&quot;<xsl:value-of select="$TransType_tc"/>&quot;&gt;<xsl:value-of select="$TransType"/> &lt;/TransType&gt; 

SoapUI接收到的輸出是:

&lt;TransType tc="1201">General Requirement Order Request &lt;/TransType> 

誰能幫助我瞭解爲什麼&lt;未轉換,但&gt;&quot;沒有。

感謝

回答

2

看一看的syntax rules described in the XML specification

右尖括號(>)可以使用字符串&gt;來表示,並且必須爲兼容性,即使用&gt;或字符引用出現時它被轉義在串]]>中的內容,當該字符串不表示一個CDATA段的結束。

所以,這是合法的:

<xml> > </xml> 

...但不會是在這種情況下:

<xml> ]]&gt; </xml> 

要允許屬性值中包含單,雙引號,撇號或單引號字符(')可能表示爲&apos;,並且雙引號字符(")表示爲&quot;

所以,這是合法的:

<xml attr=" ' " /> 

...但不會是在這種情況下:

<xml attr=' &apos; ' /> 

一些逃生編碼器開發商都過於謹慎或更容易泛化表示,因爲您不需要知道如何處理數據轉義的上下文。

2

XSLT文件 XML文件,所以當你進入像&lt;&gt;轉義值應該理解爲<>字符。然後根據需要爲輸出XML轉義所有字符。

然而,在輸出XML文檔的情況下,沒有必要逃避>",只有<,所以只有<被轉義。

您需要查看XML規範以瞭解詳細信息,尤其是CharData生成的XML解析器(這是您在所給示例中的位置)。在XML <&必須總是如果它們打算成爲字符數據,則必須轉義,並且>必須在]]之後轉義。

"永遠不需要在CharData背景下逃脫。當您可能需要逃避"是,如果你是一個屬性值(AttValue生產),它使用"作爲分隔符,例如內myattribute="this is a quote: &quot;"

請注意,如果您使用不知道XML解析上下文的工具(例如,如果您使用字符串構造XML)來生成XML,那麼最安全和最簡單的方法就是將所有三個字符時間。這就是爲什麼你經常看到&gt;&quot;不必要的逃跑了。

+0

可以請你提到互聯網引用_但是,在輸出XML文檔的上下文中,沒有必要轉義>或「,只有<,所以只有<轉義._這將有助於更好地理解 –

+0

我是無法找到任何互聯網引用,但我可以確認>不需要在XML中的任何地方轉義,而只需要轉義以避免讓他們誤認爲關閉屬性值,如<節點問候語=「"你好"」/>'。 – JLRishe

+0

@JLRishe,我用更徹底的解釋擴大了答案。如果您想了解更多細節,請參閱完整的XML規範。 '''確實需要在XML中有時*被轉義。 –

相關問題