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;了。

谢谢

4

2 回答 2

2

XSLT 文件也是XML 文件,因此当您输入转义值时,&lt;&gt;将被理解为<>字符。然后根据需要为输出 XML 转义所有字符。

但是,在输出 XML 文档的上下文中,不需要转义>",只有<,所以只有<被转义。

您需要查看 XML 规范以获取详细信息,特别是CharDataXML 解析器的生成(这是您在给出的示例中所处的位置)。在 XML中<,如果它们打算成为字符数据,则&必须始终>进行转义,如果在]].

"永远不需要在CharData上下文中转义。您可能需要转义的地方"是,如果您位于用作分隔符的属性值(AttValue产生式)中",例如myattribute="this is a quote: &quot;".

请注意,如果您使用不了解 XML 解析上下文的工具生成 XML(例如,如果您正在使用字符串构造 XML),那么最安全和最简单的做法是始终转义所有三个字符。这就是为什么您经常看到&gt;&quot;不必要地逃脱的原因。

于 2013-01-15T19:29:31.043 回答
2

查看XML 规范中描述的语法规则

右尖括号 ( >) 可以使用 string 表示,并且为了兼容性,当它出现在content 中的字符串中时,如果该字符串不标记 CDATA 部分的结尾,则&gt;必须使用其中一个或一个字符引用进行转义。&gt;]]>

所以,这是合法的:

<xml> > </xml>

...但不会在这种情况下:

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

为了允许属性值包含单引号和双引号,撇号或单引号字符 ( ') 可以表示为&apos;,双引号字符 ( ") 表示为&quot;

所以,这是合法的:

<xml attr=" ' " />

...但不会在这种情况下:

<xml attr=' &apos; ' />

一些转义编码器开发人员过于谨慎,或者更容易概括表示,因为您不需要对转义数据的上下文了解太多。

于 2013-01-15T20:24:00.627 回答