我有一种感觉,这个问题很简单,但是我已经多年没有做过任何xslt了,所以也许有人能帮上忙?
我有一段由.net类DataContractSerializer生成的xml,我需要使用xslt从这个xml中提取数据,最后得到一些html。对我来说,让事情变得复杂的是大量使用名称空间...
xml的片段如下所示:
<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:
<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?我想看看如何访问这些可能会让我访问所有我需要的东西。
非常感谢,皮特
发布于 2011-05-31 22:42:28
这是可行的,但这不是正确的方式:
//*[local-name()='Account']/grba:Name和
//*[local-name()='Agent']/grba:Name看起来更好的是您的输入,您有父名称空间。您需要选择正确的元素命名空间。例如,Account和Agent在grbd作用域中,而Name在grba中。在名称空间声明之后,您可以按如下方式进行选择:
//grbd:Account/grba:Name或
//grbd:Agent/grba:Name这对于带有前缀命名空间的元素是正确的。否则,您应该选择本地的。例如,对于第一个Id节点,您需要:
//gbd:Idhttps://stackoverflow.com/questions/6188689
复制相似问题