2011-01-25 19 views
6

xmlデータ(Webサービスからの応答)で文字列を変換しようとしています。xsltファイルで "prefix 'soap'が定義されていません。

<?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"> 
    <xsl:output method="html" indent="yes"/> 

    <xsl:template match="/"> 
     <table> 
     <tr> 
      <th>Name</th> 
     </tr> 
     <xsl:for-each select="soap:Envelope/soap:Body/ABRSearchByABNResponse/ABRPayloadSearchResults/response/legalName/"> 
      <tr> 
      <td> 
       <xsl:value-of select="givenName"/> 
      </td>  
      </tr> 
     </xsl:for-each> 

     </table> 
    </xsl:template> 
</xsl:stylesheet> 

ただし、「接頭辞 'soap'が定義されていません」というメッセージが表示されますが、これを修正するにはどうすればよいですか。おかげさまで

+0

良い質問、+1。説明と完全な解決方法については私の答えを参照してください。 –

答えて

5

XSLTでは、XPath式で使用されるすべての名前空間接頭辞は、対応する名前空間宣言で定義する必要があります。

これはあなたのコードでは該当しないため、エラーです。

ソリューション

は石鹸の名前空間を宣言します。

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
xmlns:soap="http://soap/envelope/" 
> 
+0

@Alejandro:うん、今朝少し眠い。 :) –

+0

@Alejandro:修正されました。 –

+0

+1正解です。 –

0

名前空間接頭辞、あなたのケースではsoapは、本当の名前空間URIのためだけの省略形です。 http://soap/envelope/を避けるために、soaphttp://soap/envelope/を表し、文書の残りの部分にsoapを使用するように定義することができます。

これは、名前空間接頭辞を使用する場合、実際の名前空間が見つかるように定義する必要があることを意味します。

pizzahttp://soap/envelope/に対応し、その代わりに使用することもできます。 soap名前空間接頭辞は特別なものではありません。

+0

私は使用する必要があります のように、「xsl:for-each select = "msxsl" xmlns:soap = "http:// soap/Envelope/Body/ ​​ ます。 ? – peter

関連する問題