带有XML源的XSLT,其默认名称空间设置为xmlns

时间:2009-08-27 22:47:35

标签: xslt namespaces

我有一个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文档中究竟需要做什么?

3 个答案:

答案 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标签
  • 中添加“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>