2017-05-02 13 views
0

次のXML入力ファイルがあり、空のノードなしで出力XMLを取得しようとしています。私は出力を期待していXSLTを使用したXMLの空の要素の除外

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/04/secext"> 
    <soap:Body> 
     <InstantIDResponseEx xmlns="http://webservices.seisint.com/WsIdentity"> 
      <response> 
       <Header> 
        <Status>0</Status> 
        <TransId>41904</TransId> 
        <User></User> 
       </Header> 
       <Result> 
        <Data/> 
       </Result> 
      </response> 
     </InstantIDResponseEx> 
    </soap:Body> 
</soap:Envelope> 

次のXMLのようなものです:

<?xml version="1.0" encoding="UTF-8"?> 
    <Verification_response> 
    <System_Data> 
      <STATUSMESSAGE>0</STATUSMESSAGE> 
      <TRANSACTIONID>41904</TRANSACTIONID> 
    </System_Data> 
    </Verification_response> 
+0

あなたが困難を抱えている問題のどの部分?あなたは何を試しましたか、そしてどこで立ち往生しましたか? –

+0

私の質問は、空のノードが除外されている別のXMLファイルにXMLファイルを変換する方法です。 – Lionfish

+0

私の質問は、空のノードが除外されている別のxmlファイルにxmlファイルを変換するために、xsltスタイルシートを書く方法です。 – Lionfish

答えて

0

あなたがこの困難を発見している理由を説明スタイルシートと間違っていくつかのものがあります。

まず、完全にモノリシックです。ルートノードに一致するテンプレートルールが1つだけあるため、条件付きロジックを追加するのが面倒です。各ノードがノードに一致するテンプレートルールで処理され、その子を処理するためにapply-templatesを呼び出す「再帰的降下」パターンを目指す必要があります。

第2に、ディセーブル出力エスケープの使用はちょっと奇妙です。私は初心者のスタイルシートでこれがどれほど頻繁に見られるのか驚いています。 XSLTが結果としてノードツリーを生成することについて人々が理解していないために行われることもありますが、それは字句解析XMLを生成することではありません。しかし、このような場合は、不必要で間違っているだけです。テキストに特殊文字がある場合、それらをエスケープしたい場合、エスケープを無効にすると、データに特殊文字が現れると、出力が悪くなります。それをしないでください。

問題が発生しました。

まず、それは空白が意味を持たないし、ただ邪魔になるXMLのこの種の

<xsl:strip-space elements="*"/> 

を追加することをお勧めします。あなたができるので、それが実際にデフォルトのルールだけれども

<xsl:template match="*"> 
    <xsl:apply-templates/> 
</xsl:template> 

:今

あなたがステータスとTRANSID要素のためのルールを書くことができます。

<xsl:template match="Status"> 
    <STATUSMESSAGE> 
    <xsl:value-of select="."/> 
    </STATUSMESSAGE> 
</xsl:template> 

<xsl:template match="TransId"> 
    <TRANSACTIONID> 
    <xsl:value-of select="."/> 
    </TRANSACTIONID> 
</xsl:template> 

および他の要素のための一般的なルールがあると思われますあなたが望むならそれを放置してください。

今や空ノードを必要としないというルールが必要だと言っています。私はあなたが十分な例を与えていないので、それを解釈することが少し難しいです。しかし、TransIdが空の場合、TRANSACTIONID要素を出力したくないとします。

<xsl:template match="*[not(child::node)]"/> 

、その後はトップレベルのルールは次のようになります:その後、空要素のための優先度の高いルールを追加することによって、これを達成でき

<xsl:template match="/"> 
    <Verification_response> 
    <System_Data> 
      <xsl:apply-templates select="/soap:Envelope/soap:Body/Identity:InstantIDResponseEx/Identity:response"/> 
    </System_Data> 
    </Verification_response> 
</xsl:template> 
+0

結果は次のようである: 041904 別の投稿にスタ​​イルシートを投稿しました。どうしましたか? – Lionfish

+0

一致パターンにID:接頭辞を使用する必要があります。 –

関連する問題