2009-11-13 121 views
35

我有一些XML,我试图使用XSLT转换为HTML,但我无法让它为我的生活工作。有人能告诉我我做错了什么吗?XSLT使用命名空间转换XML

XML

<ArrayOfBrokerage xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.test.com/"> 
    <Brokerage> 
     <BrokerageID>91</BrokerageID> 
     <LastYodleeUpdate>0001-01-01T00:00:00</LastYodleeUpdate> 
     <Name>E*TRADE</Name> 
     <Validation i:nil="true" /> 
     <Username>PersonalTradingTesting</Username> 
    </Brokerage> 
</ArrayOfBrokerage> 

XSLT

<xsl:stylesheet version="1.0" xmlns="http://www.test.com/" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xslFormatting="urn:xslFormatting"> 

    <xsl:output method="html" indent="no"/> 

    <xsl:template match="/ArrayOfBrokerage"> 
     <xsl:for-each select="Brokerage"> 
      Test 
     </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 

回答

49

您需要在xslt中为正在转换的元素提供名称空间前缀。出于某种原因(至少在Java JAXP解析器中),不能简单地声明默认名称空间。这对我有用:

<xsl:stylesheet version="1.0" xmlns:t="http://www.test.com/" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xslFormatting="urn:xslFormatting"> 

    <xsl:output method="html" indent="no"/> 

    <xsl:template match="/t:ArrayOfBrokerage"> 
     <xsl:for-each select="t:Brokerage"> 
      Test 
     </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 

这将捕获您的XML文档中命名空间的所有内容。

+0

这也适用于我的测试(在Visual Studio 2008中运行XSLT调试) – Murph 2009-11-13 18:19:37

+0

这确实有用。我曾尝试过使用exclude-result-prefixes =“t”的组合,因为我认为它可以让我在每个节点之前不必粘贴t :.有没有办法避免这样做? – Chris 2009-11-13 18:21:10

+2

我不认为有。 – 2009-11-13 18:23:38

-2

你如何执行转换?也许你忘了将XSLT样式表链接到XML文档使用:

<?xml-stylesheet type="text/xsl" href="cdcatalog.xsl"?> 

在XML文档的开头。 More explanation here

+0

我不确定这是什么意思。实际上,我并未对XML文件进行转换,而是使用DataContractSerializer序列化业务对象,并在对象的DataContract中指定命名空间。 – Chris 2009-11-13 18:09:17