ルートにデフォルトのネームスペースが示された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ドキュメントで正確に何をする必要がありますか?
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="..."
範囲内。
XSLT 2.0を使用する場合は、stylesheet
セクションでxpath-default-namespace="http://www.example.com"
を指定します。
これが一種の名前空間の問題である場合、xsltファイルの2つのことを変更しようとする余地があります。
<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>