2

SoapUI を介して SOAP リクエストを送信し、それを使用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

XML 仕様で説明されている構文規則を確認してください。

右山かっこ ( >) は文字列 を使用して表すことができ、互換性のために、文字列が CDATA セクションの末尾をマークしていない場合、コンテンツ内の文字列に表示される場合は または 文字参照&gt;を使用してエスケープする必要があります。&gt;]]>

したがって、これは合法です:

<xml> > </xml>

...しかし、この場合はそうではありません:

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

属性値に一重引用符と二重引用符の両方を含めることができるようにするには、アポストロフィまたは一重引用符 ( ) を として、二重引用符 ( ) を として'表すことができます。&apos;"&quot;

したがって、これは合法です:

<xml attr=" ' " />

...しかし、この場合はそうではありません:

<xml attr=' &apos; ' />

一部のエスケープ エンコーダー開発者は過度に用心深いか、データをエスケープしているコンテキストについてあまり知る必要がないため、表現を一般化する方が簡単です。

于 2013-01-15T20:24:00.627 に答える
2

XSLT ファイル&lt;XML ファイルであるため、 orのようなエスケープ値を入力すると、 or文字&gt;として認識されます。必要に応じて、すべての文字が出力 XML 用にエスケープされます。<>

ただし、出力 XML ドキュメントのコンテキストでは、>or"のみをエスケープする必要はないため、 のみ<<エスケープされます。

詳細、特にCharDataXML パーサーの生成については、XML 仕様を確認する必要があります (これは、提供している例の場所です)。XMLでは<、文字データを意図している場合は常に&エスケープする必要があり、文字データの後にある場合はエスケープする必要があります。>]]

"CharDataコンテキストでエスケープする必要はありません。エスケープする必要があるのは、区切り文字として使用して"いる属性値 ( AttValueproduction )内にいる場合です。"myattribute="this is a quote: &quot;"

XML 構文解析コンテキストを認識しないツールを使用して XML を生成している場合 (たとえば、文字列を使用して XML を構築している場合)、最も安全で簡単な方法は、常に 3 つの文字すべてをエスケープすることです。&gt;これが、不必要に見たり&quot;逃げたりすることが多い理由です。

于 2013-01-15T19:29:31.043 に答える