我有一个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文档中究竟需要做什么?
答案 0 :(得分:62)
您需要在XSLT中声明命名空间,并在XPath表达式中使用它。 E.g:
<xsl:stylesheet ... xmlns:my="http://www.mysite.com">
<xsl:template match="/my:MyRoot"> ... </xsl:template>
</xsl:stylesheet>
请注意,如果要在XPath中引用该命名空间中的元素,则必须提供一些前缀。虽然你可以只做xmlns="..."
没有前缀,它可以用于文字结果元素,但它不适用于XPath - 在XPath中,一个无前缀的名称总是被认为是在带有空白URI的命名空间中,无论范围内的任何xmlns="..."
。
答案 1 :(得分:27)
如果您使用XSLT 2.0,请在xpath-default-namespace="http://www.example.com"
部分指定stylesheet
。
答案 2 :(得分:4)
如果这是名称空间问题,那么可以尝试修改xslt文件中的两个内容:
<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>