Skip to main content
 首页 » 编程设计

具有默认命名空间设置为 xmlns 的 XML 源的 XSLT

2024年02月27日10mfryf

我有一个 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 中声明 namespace ,并在 XPath 表达式中使用它。例如:

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

请注意,如果您想在 XPath 中引用该命名空间中的元素,您必须提供一些前缀。虽然您可以在没有前缀的情况下执行 xmlns="..." ,并且它适用于文字结果元素,但它不适用于 XPath - 在 XPath 中,无前缀的名称始终被视为位于具有空白 URI 的命名空间中,无论范围内有任何 xmlns="..."