2017-05-11 21 views
0

問題があります。XSLTを使用して名前空間要素を追加する方法

要素レスポンスはネームスペースなしでなければなりません(ルート要素が定義されています)。

入力XSLT:

<xsl:stylesheet 
     xpath-default-namespace="http://www.iata.org/IATA/EDIST" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:h="http://www.iata.org/IATA/EDIST" 
     version="1.0" 
     > 

    <xsl:template match="h:Response[not(h:OrderViewProcessing)]"> 
    <Response xmlns="http://www.iata.org/IATA/EDIST"> 
     <OrderViewProcessing> 
      <MarketingMessages> 
       <MarketingMessage> 
        <Text> 
         Error text 
        </Text> 
       </MarketingMessage> 
      </MarketingMessages> 
     </OrderViewProcessing> 
     <xsl:apply-templates/> 
    </Response> 
    </xsl:template> 

</xsl:stylesheet> 

出力XML:

<Response xmlns:h="http://www.iata.org/IATA/EDIST" 
      namespace="http://www.iata.org/IATA/EDIST"> 

     <OrderViewProcessing> 
     <MarketingMessages> 
      <MarketingMessage> 
       <Text> 
       Error Text 
        </Text> 
      </MarketingMessage> 
     </MarketingMessages> 
     </OrderViewProcessing> 

</Response> 

私はXMLのような必要があります:あなたはXSLTで= "http://www.iata.org/IATA/EDIST" のxmlnsを削除した場合

<Response> 

     <OrderViewProcessing> 
     <MarketingMessages> 
      <MarketingMessage> 
       <Text> 
       Error Text 
        </Text> 
      </MarketingMessage> 
     </MarketingMessages> 
     </OrderViewProcessing> 

</Response> 

、その後のxmlns = XMLの ""は空になります。

更新

この方法で解決この問題:おそらく

<xsl:template match="h:Response[not(h:OrderViewProcessing)]"> 
    <xsl:element name="Response" namespace="http://www.iata.org/IATA/EDIST"> 
     <xsl:element name="OrderViewProcessing" namespace="http://www.iata.org/IATA/EDIST"> 
      <xsl:element name="MarketingMessages" namespace="http://www.iata.org/IATA/EDIST"> 
       <xsl:element name="MarketingMessage" namespace="http://www.iata.org/IATA/EDIST"> 
        <xsl:element name="Text" namespace="http://www.iata.org/IATA/EDIST"> 
       Error text 
        </xsl:element> 
       </xsl:element> 
      </xsl:element> 
     </xsl:element> 
     <xsl:apply-templates/> 
    </xsl:element> 
    </xsl:template> 

、解決策は、より良いでなければなりません。

+0

'apim'という接頭辞はあなたのXSLTにはないので、入力XMLから来なければなりません。それぞれの名前空間がどこから来るのか、与えられた要素がどのコンテキストにあるのかを調べるには、入力XMLを見る必要があります。 –

答えて

1

xpath-default-namespaceとversion = "1.0"を使用していますが、この属性はXSLT 2.0でのみ定義されているため、一貫性がありません。 常には、使用しているXSLTのバージョンを教えてください。

レスポンス要素をネームスペース"http://www.iata.org/IATA/EDIST"に明示的に作成していますが、ネームスペースが不要であると言いますがなぜあなたはこれをやっている?

出力には属性namespace="http://www.iata.org/IATA/EDIST"が含まれていますが、XSLTにはおそらくこの属性を生成するものはありません。私はこれがあなたのXSLTのいくつかの実験的なバリエーションから来たに違いないと思います。

一般に、スタイルシートに名前空間を宣言し、出力にコピーしたくない場合は、xsl:stylesheet要素にexclude-result-prefixes="#all"を指定する必要があります。しかし、私はここであなたがはっきりと説明していないことがもう少し起こっていると思います。

+0

はい、バージョン2.0です。ありがとう – alexdeia

関連する問題