1

ソース XML があります

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body>
<PublishANZINCIDENTESB xmlns="http://www.ibm.com/maximo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" creationDateTime="2013-02-25T23:25:35+00:00" transLanguage="EN" baseLanguage="EN" messageID="1361834735434709840" maximoVersion="7 1 20110105-1024 V7118-37" event="1"><ANZINCIDENTESBSet><INCIDENT action="Replace"></INCIDENT></ANZINCIDENTESBSet></PublishANZINCIDENTESB></soapenv:Body></soapenv:Envelope>

タグに名前空間とヘッダーを追加してターゲット XML に変更したいと考えています。出力 XML は

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:s600="http://LIB_ISM_WPS/S600_PublishANZINCIDENT_Service_INT" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Header/><soapenv:Body>
<s600:PublishANZINCIDENTESBOperation><PublishANZINCIDENTESB xmlns="http://www.ibm.com/maximo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" creationDateTime="2013-02-25T23:25:35+00:00" transLanguage="EN" baseLanguage="EN" messageID="1361834735434709840" maximoVersion="7 1 20110105-1024 V7118-37" event="1"><ANZINCIDENTESBSet><INCIDENT action="Replace"></INCIDENT></ANZINCIDENTESBSet></PublishANZINCIDENTESB></s600:PublishANZINCIDENTESBOperation></soapenv:Body></soapenv:Envelope>

私が使用しているXSL:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:s600="http://LIB_ISM_WPS/S600_PublishANZINCIDENT_Service_INT" >
 <s600:PublishANZINCIDENTESBOperation>
 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>
</s600:PublishANZINCIDENTESBOperation>
 <xsl:template match="*">
  <xsl:element name="s600:{name()}" namespace="http://LIB_ISM_WPS/S600_PublishANZINCIDENT_Service_INT">
   <xsl:copy-of select="namespace::*"/>
       <xsl:apply-templates select="node()|@*"/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>

頭を悩ませているので、できるだけ早く助けてもらえますか?

4

1 に答える 1

0

s600:PublishANZINCIDENTESBOperation入力と出力の例から、要素をコンテンツの周りにラップしたいだけのように見えますsoapenv:Bodyが、それ以外の場合はコンテンツを変更しないでください。あなたはこれを達成することができます

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:s600="http://LIB_ISM_WPS/S600_PublishANZINCIDENT_Service_INT"
 xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">

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

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

  <!-- If the namespace declaration absolutely _must_ be on the Envelope 
       you could uncomment this extra template -->
  <!--
  <xsl:template match="soapenv:Envelope">
    <soapenv:Envelope>
      <xsl:apply-templates select="@*|node()" />
    </soapenv:Envelope>
  </xsl:template>
  -->
</xsl:stylesheet>

これにより、探している出力が生成されます。ただし、xmlns:s600宣言はs600:PublishANZINCIDENTESBOperationではなく要素で行わsoapenv:Envelopeれますが、データを処理するのではなく、適切な XML パーサーを使用してデータを処理している場合、これはダウンストリーム コンポーネントにとって重要ではありません。テキストとして。宣言を封筒に入れることが本当に重要な場合は、3 番目のテンプレートのコメントを外してください。

于 2013-03-29T14:27:05.760 に答える