为什么xsl:value-of在这里不起作用(XML名称空间)?

时间:2018-08-20 16:19:09

标签: xml xslt xpath xml-namespaces

我从ASP.NET Web API获得以下XML代码段:

<DrilldownModel xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://schemas.datacontract.org/2004/07/MY.API.Models">
  <AddressInfo xmlns:d2p1="http://schemas.datacontract.org/2004/07/MY.API.Entities.Drilldown">
    <d2p1:AddressNumber>4213</d2p1:AddressNumber>
    <d2p1:AddressUseType>RESIDENTIAL</d2p1:AddressUseType>
    <d2p1:EncryptedParcelId i:nil="true" />
    <d2p1:GisError i:nil="true" />
    <d2p1:GisErrorDetail i:nil="true" />
  </AddressInfo>
</DrilldownModel>

我正在使用以下方法尝试从文档中获取值:

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://schemas.datacontract.org/2004/07/MY.API.Models"
  xmlns:d2p1="http://schemas.datacontract.org/2004/07/MY.API.Entities.Drilldown"
 >
  <xsl:template match="/">
    <html>
      <body>
        <xsl:value-of select="//AddressInfo/d2p1:AddressNumber"/>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

但是我没有收回价值。如果删除默认名称空间xmlns="http://schemas.datacontract.org/2004/07/MY.API.Models,则可以检索该值。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

意识到默认名称空间也适用于没有名称空间前缀的后代元素,并且在xsl:stylesheet上声明默认名称空间不会影响XSLT中的XPath。

因此,在您的XSLT中,为默认名称空间定义一个名称空间前缀:

xmlns:i="http://schemas.datacontract.org/2004/07/MY.API.Models"

然后替换

    <xsl:value-of select="//AddressInfo/d2p1:AddressNumber"/>

使用

    <xsl:value-of select="//m:AddressInfo/d2p1:AddressNumber"/>

,以便您在AddressInfo命名空间中选择http://schemas.datacontract.org/2004/07/MY.API.Models个元素。