0

XSLT で変更したい比較的単純な SOAP 応答メッセージ XML があります。

これが私がこれまでに持っているものです:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
    xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
    xmlns:z="http://some.url/WS/">
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="@* | node()">
      <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
      </xsl:copy>
    </xsl:template>

    <xsl:variable name="Method" select="name(//soap:Body/*)" />

    <xsl:template match="//soap:Body/*" >
      <xsl:choose>
        <xsl:when test="$Method='Method1Response'">
          <xsl:call-template name="Method1" />
        </xsl:when>
        <xsl:otherwise>

        </xsl:otherwise>
      </xsl:choose>      
    </xsl:template>

      <xsl:template name="Method1" match="//soap:Body/z:Method1Response/z:Method1Result/z:Errors" />

</xsl:stylesheet>

サンプル XML:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing">
<env:Header xmlns:env="http://www.w3.org/2003/05/soap-envelope">
  <wsa:Action></wsa:Action>
  <wsa:MessageID></wsa:MessageID>
  <wsa:RelatesTo></wsa:RelatesTo>
  <wsa:To>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:To>
</env:Header>
  <soap:Body>
    <Method1Response xmlns="http://some.url/WS/">
      <Method1Result>
        <Msg>blah blah</Msg>
        <Errors>
          <ErrorItem>error 1</ErrorItem>
          <ErrorItem>error 2</ErrorItem>
        </Errors>
        <Data />
      </Method1Result>
    </Method1Response>
  </soap:Body>
</soap:Envelope>

Method1 = 特定の値の場合、Method1Result の下からエラーを削除するという考え方です。そうでない場合は、そのままにしておきます。私が現在持っているものは、それをしていません。ありがとう。

さらに明確にするための別の編集: 異なる Web サービス呼び出しに属する複数の XML ファイルに対して単一の XSLT ファイルが必要です。これは、Method1 がたとえば GetMeal、GetWindow、GetHandle、GetWeatherReport などのさまざまな値を持つことができることを意味します。テスト目的で予想される XML。毎回異なる要素を削除します。

4

2 に答える 2

0

スタイルシートのサンプルから:

<xsl:variable name="Method" select="name(//soap:Body/*)" />

<xsl:template match="//soap:Body/*" >
  <xsl:choose>
    <xsl:when test="$Method='Method1Response'">
      <xsl:call-template name="Method1" />

variable を取り除き$Methodます。必要ありません。

*search 式 ( のように)とは対照的に、一致パターン( のようにmatch="//soap:Body/*"、扱いにくい) に注意してください。select="name(//soap:Body/*)"match="soap:Body/*"

明示的な条件付きロジックを使用する代わりに、特殊なケースに一致するテンプレートを提供し、他の候補テンプレートよりも優先度が高いことを確認して、一致するようにします。

<xsl:template match="z:Method1Response"/><!-- suppressed -->

または、明示的に優先度を上げた場合:

<xsl:template match="z:Method1Response" priority="2"/>

または、より具体的には含まれているエラーの場合:

<xsl:template match="z:Method1Response[z:Method1Result/z:Errors]"/>
于 2012-05-16T12:26:23.437 に答える
0

問題は、一致する//soap:Body/*テンプレート自体が何も出力しない名前付きテンプレートを呼び出すことです。これにより、soap:Bodyの下のすべての要素が無視されます。

削除する要素に一致するテンプレートが既にあるため、 soap:Bodyに一致するテンプレートを削除すると、期待どおりに機能することがわかります。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" 
    xmlns:soap="http://www.w3.org/2003/05/soap-envelope" 
    xmlns:z="http://some.url/WS/"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="@* | node()"> 
      <xsl:copy> 
        <xsl:apply-templates select="@* | node()"/> 
      </xsl:copy> 
    </xsl:template> 

    <xsl:template match="//soap:Body/z:Method1Response/z:Method1Result/z:Errors" /> 
</xsl:stylesheet> 

これをサンプル XML に適用すると、次のように出力されます。

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing">
   <env:Header xmlns:env="http://www.w3.org/2003/05/soap-envelope">
      <wsa:Action/>
      <wsa:MessageID/>
      <wsa:RelatesTo/>
      <wsa:To>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:To>
   </env:Header>
   <soap:Body>
      <Method1Response xmlns="http://some.url/WS/">
         <Method1Result>
            <Msg>blah blah</Msg>
            <Data/>
         </Method1Result>
      </Method1Response>
   </soap:Body>
</soap:Envelope>

編集:返される可能性のある他のメソッド応答を処理するために、さらに一致するテンプレートを使用できない理由はありません。例えば....

<xsl:template match="//soap:Body/z:GetMealResponse/z:GetMealResult/z:Leftovers" />
<xsl:template match="//soap:Body/z:Method1Response/z:Method1Result/z:Errors" /> 
于 2012-05-16T12:14:57.500 に答える