2011-12-17 12 views
2

私はジレンマに陥りました。特定のアプリケーションでは、私は次のようになりSOAPリクエストからXMLの結果を受けています:XML結果のXSLTによる除外

<env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'> 
    <env:Header /> 
    <env:Body> 
    <ns1:searchResponse xmlns:ns1='http://url.to.namespace' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'> 
     <ns1:result>&lt;?xml version="1.0"?&gt;&lt;results count="201" returned="201" code="200" msg="successful"&gt;&lt;result order="0"&gt;&lt;dirkey&gt;DK886shn3525&lt;/dirkey&gt;&lt;eid&gt;smith&lt;/eid&gt;&lt;email&gt;[email protected]&lt;/email&gt;&lt;fn&gt;Smith&lt;/fn&gt;&lt;ln&gt;Bob&lt;/ln&gt;&lt;wid&gt;859589157&lt;/wid&gt;&lt;score&gt;70&lt;/score&gt;&lt;/result&gt;&lt;result order="1"&gt;&lt;dirkey&gt;DK547fjx6702&lt;/dirkey&gt;&lt;eid&gt;james31&lt;/eid&gt;&lt;email&gt;[email protected]&lt;/email&gt;&lt;fn&gt;Tim&lt;/fn&gt;&lt;ln&gt;Allen&lt;/ln&gt;&lt;stu&gt;&lt;lvl&gt;Senior&lt;/lvl&gt;&lt;plans&gt;&lt;plan&gt;Technology Management-B&lt;/plan&gt;&lt;/plans&gt;&lt;contacts&gt;&lt;contact type="permanent"&gt;&lt;city&gt;Salina&lt;/city&gt;&lt;phone&gt;(123) 456-7890&lt;/phone&gt;&lt;postal&gt;67401&lt;/postal&gt;&lt;street1&gt;1111 Main Ln&lt;/street1&gt;&lt;state&gt;KS&lt;/state&gt;&lt;/contact&gt;&lt;/contacts&gt;&lt;/stu&gt;&lt;wid&gt;2222222222&lt;/wid&gt;&lt;score&gt;20&lt;/score&gt;&lt;/result&gt;</ns1:result> 
    </ns1:searchResponse> 
    </env:Body> 
</env:Envelope> 

私は<ns1:result>要素内に含まれるデータの中で最も興味を持っています。これはHTMLの世界では意味をなさないかもしれませんが、<ns1:result>というテキストがXMLとして必要です。

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:ns1="http://url.to.namespace" 
    exclude-result-prefixes="env ns1"> 

    <xsl:output omit-xml-declaration="yes" indent="yes" method="text" /> 
    <xsl:strip-space elements="*"/> 

    <!-- Template #1 - Identity Transform --> 
    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
    </xsl:template> 

    <!-- Template #2 - for all text() nodes, disable output escaping --> 
    <xsl:template match="text()"> 
    <xsl:copy-of select="." disable-output-escaping="yes" /> 
    </xsl:template> 

</xsl:stylesheet> 

...技術的には私が欲しいものを作るん:XSLを経由してこれを行うことの可能性に興味をそそられ、私は次のスタイルシートを構築しかし

<?xml version="1.0"?> 
<results count="201" returned="201" code="200" msg="successful"> 
    <result order="0"> 
    <dirkey>DK886shn3525</dirkey> 
    <eid>smith</eid> 
    <email>[email protected]</email> 
    <fn>Bob</fn> 
    <ln>Smith</ln> 
    <wid>859589157</wid> 
    <score>70</score> 
    </result> 
    <result order="1"> 
    <dirkey>DK547fjx6702</dirkey> 
    <eid>ta</eid> 
    <email>[email protected]</email> 
    <fn>Tim</fn> 
    <ln>Allen</ln> 
    <stu> 
     <lvl>Senior</lvl> 
     <plans> 
     <plan>Technology Management-B</plan> 
     </plans> 
     <contacts> 
     <contact type="permanent"> 
      <city>Salina</city> 
      <phone>(123) 456-7890</phone> 
      <postal>67401</postal> 
      <street1>1111 Main Ln</street1> 
      <state>KS</state> 
     </contact> 
     </contacts> 
    </stu> 
    <wid>2222222222</wid> 
    <score>20</score> 
    </result> 
</results> 

を、私はそれを聞きましたDOEは絶望的な個人の兆候だと語った。実際、私たちのアプリケーション(テンプレートエンジンにXMLを渡す前にXMLを変換するように設計されているアプリケーション)を使ってこのXSLTを実行しようとすると、機能しません。 DOEが私たちの特定のXSLパーサに実装されていないと推測しています...

DOXのようなパーサー固有の手法を使用せずにこれらのエンティティをエスケープするXSLT 1.0の方法はありますか?私の考えでは、特定のエスケープ文字(例えば&gt;)を文字通りの文字列(>)に変換する方法を考えていましたが、どうしたらよいか分かりません。

いつものように、私はあなたの助けに感謝します。

P.S.この出力がどれほど嫌なのか、ドキュメント構造をどのように変えてしまったのかを教えてください。私たちはすでにそれを変更しようとしましたが、それは選択肢ではありません。 DOEのようにパーサ固有の戦術を使用せずに、これらのエンティティアンエスケープ にXSLT 1.0での方法があります私の1に考えたのは エスケープ特定の変換方法を構築されています:(

答えて

1

だから、ここ究極の質問です?文字(例えば、>)そのリテラル対応 (>)に...しかし、私はそれについてどのように行くと思い全くわからない。

破壊し再構築するために、純粋なXSLTの方法はありませんマークアップ - XSLT 3.0まで(まだW3C作業中のドラフト)tあなたが可能なXSLT 3.0になるまで、帽子がparse-xml()

標準機能をxaveなり、破壊されたマークアップを再構築する安全な方法は、あなた自身を記述する必要が同様の署名で拡張機能を呼び出すことです。

この拡張関数は、文字列引数をXmlDocumentのインスタンスに解析し、成功した場合は結果を返します。

+0

いつものように、@Dimitreに感謝します。 – ABach

+0

@ABach:どうぞよろしくお願いいたします。 –

関連する問題