首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何处理XML名称空间

如何处理XML名称空间
EN

Stack Overflow用户
提问于 2011-05-31 21:57:04
回答 2查看 1.2K关注 0票数 2

我有一种感觉,这个问题很简单,但是我已经多年没有做过任何xslt了,所以也许有人能帮上忙?

我有一段由.net类DataContractSerializer生成的xml,我需要使用xslt从这个xml中提取数据,最后得到一些html。对我来说,让事情变得复杂的是大量使用名称空间...

xml的片段如下所示:

代码语言:javascript
运行
复制
<FundDeal xmlns:i="http://www.w3.org/2001/XMLSchema-instance"  xmlns="http://schemas.datacontract.org/2004/07/Guide.Rx.BusinessObjects.Deal">
    <Id xmlns="http://schemas.datacontract.org/2004/07/Guide.BusinessObjects.Deal">DEAL12345</Id>
    <Account xmlns:d2p1="http://schemas.datacontract.org/2004/07/Guide.Rx.BusinessObjects.Account">
        <d2p1:AlternateId i:nil="true"/>
        <d2p1:Designation>XXX</d2p1:Designation>
        <d2p1:Name>QWERTY</d2p1:Name>
        <d2p1:Number>12345678</d2p1:Number>
        <d2p1:Status i:nil="true"/>
    </Account>
    <Agent xmlns:d2p1="http://schemas.datacontract.org/2004/07/Guide.Rx.BusinessObjects.Account">
        <d2p1:Id>54321</d2p1:Id>
        <d2p1:Name>ASDFG</d2p1:Name>
        <d2p1:Status>Active</d2p1:Status>
    </Agent>
    ....
</FundDeal>

现在,我需要通过样式表转换这个xml,我发现这个过程相当困难。我认识到xsl需要自己对所涉及的名称空间的引用,并且可以使用以下xsl轻松地提取上面的交易Id:

代码语言:javascript
运行
复制
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:ms="urn:schemas-microsoft-com:xslt"
    xmlns:grbd="http://schemas.datacontract.org/2004/07/Guide.Rx.BusinessObjects.Deal"
    xmlns:gbd="http://schemas.datacontract.org/2004/07/Guide.BusinessObjects.Deal"
    xmlns:grba="http://schemas.datacontract.org/2004/07/Guide.Rx.BusinessObjects.Account">
    <xsl:output indent="yes" omit-xml-declaration="yes" method="html"/>
    <xsl:template match="/">
      <html>
        <head>
          <!-- some styles here -->
        </head>
        <body>
          <table cellpadding="5" cellspacing="5" border="0">
            <tr>
              <td class="SectionTitle" colspan="2">
                <xsl:text>Deal Cancellation Notification - </xsl:text>
                <xsl:value-of select="//ggbd:Id"/>
              </td>
            </tr>
          </table>
        </body>
      </html>
    </xsl:template>
</xsl:stylesheet>   

但是我很难读懂像帐户名这样的东西,因为似乎有多个名称空间在运行。

谁能告诉我访问(a)帐户名和(b)代理名称的xpath?我想看看如何访问这些可能会让我访问所有我需要的东西。

非常感谢,皮特

EN

Stack Overflow用户

回答已采纳

发布于 2011-05-31 22:42:28

这是可行的,但这不是正确的方式:

代码语言:javascript
运行
复制
 //*[local-name()='Account']/grba:Name

代码语言:javascript
运行
复制
 //*[local-name()='Agent']/grba:Name

看起来更好的是您的输入,您有父名称空间。您需要选择正确的元素命名空间。例如,AccountAgentgrbd作用域中,而Namegrba中。在名称空间声明之后,您可以按如下方式进行选择:

代码语言:javascript
运行
复制
//grbd:Account/grba:Name

代码语言:javascript
运行
复制
//grbd:Agent/grba:Name

这对于带有前缀命名空间的元素是正确的。否则,您应该选择本地的。例如,对于第一个Id节点,您需要:

代码语言:javascript
运行
复制
//gbd:Id
票数 2
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6188689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档