web-dev-qa-db-ja.com

デフォルト名前空間がxmlnsに設定されたXMLソースを使用したXSLT

ルートにデフォルトのネームスペースが示されたXMLドキュメントがあります。このようなもの:

<MyRoot xmlns="http://www.mysite.com">
   <MyChild1>
       <MyData>1234</MyData> 
   </MyChild1> 
</MyRoot>

XMLを解析するXSLTは、デフォルトのネームスペースが原因で期待どおりに機能しません。つまり、ネームスペースを削除すると、すべてが期待どおりに機能します。

これが私のXSLTです。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:template match="/" >
  <soap:Envelope xsl:version="1.0" 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/">
   <soap:Body>
     <NewRoot xmlns="http://wherever.com">
       <NewChild>
         <ChildID>ABCD</ChildID>
         <ChildData>
            <xsl:value-of select="/MyRoot/MyChild1/MyData"/>
         </ChildData>
       </NewChild>
     </NewRoot>
   </soap:Body>
  </soap:Envelope>
 </xsl:template>
</xsl:stylesheet>

翻訳が正しく機能するためには、XSLTドキュメントで何をする必要がありますか? XSLTドキュメントで正確に何をする必要がありますか?

57
Larry

XSLTで名前空間を宣言し、XPath式で使用する必要があります。例えば。:

<xsl:stylesheet ... xmlns:my="http://www.mysite.com">

   <xsl:template match="/my:MyRoot"> ... </xsl:template>

</xsl:stylesheet>

XPathでその名前空間の要素を参照する場合は、mustプレフィックスを指定することに注意してください。ただ_xmlns="..."はプレフィックスなしで、リテラルの結果要素に対しては機能しますが、XPathに対しては機能しません。XPathでは、xmlns="..." 範囲内。

64
Pavel Minaev

XSLT 2.0を使用する場合は、stylesheetセクションでxpath-default-namespace="http://www.example.com"を指定します。

27
vinh

これが一種の名前空間の問題である場合、xsltファイルの2つのことを変更しようとする余地があります。

  • xsl:stylesheetタグに「my」名前空間定義を追加
  • xmlファイルを走査する際に要素を呼び出すときに「my:」プレフィックスを使用します。

結果

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:my="http://www.w3.org/2001/XMLSchema">
    <xsl:template match="/" >
        <soap:Envelope xsl:version="1.0" 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/">
            <soap:Body>
                <NewRoot xmlns="http://wherever.com">
                    <NewChild>
                        <ChildID>ABCD</ChildID>
                        <ChildData>
                            <xsl:value-of select="/my:MyRoot/my:MyChild1/my:MyData"/>
                        </ChildData>
                    </NewChild>
                </NewRoot>
            </soap:Body>
        </soap:Envelope>
    </xsl:template>
</xsl:stylesheet>
4
hama4g