【问题标题】:XSLT Transform XML with NamespacesXSLT 使用命名空间转换 XML
【发布时间】:2010-12-16 09:31:10
【问题描述】:

我正在尝试使用 XSLT 将一些 XML 转换为 HTML

问题:

我无法让它工作。谁能告诉我我做错了什么?

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>

【问题讨论】:

    标签: xml xslt namespaces transform datacontractserializer


    【解决方案1】:

    您如何执行转换?也许您忘记使用以下方法将 XSLT 样式表链接到 XML 文档:

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

    在 XML 文档的开头。 More explanation here.

    【讨论】:

    • 我不确定你的意思。我实际上并没有对 XML 文件进行转换,而是使用 DataContractSerializer 序列化业务对象并在对象的 DataContract 中指定命名空间。
    【解决方案2】:

    您需要在 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 文档中命名空间的所有内容。

    【讨论】:

    • 这在测试中也对我有用(在 Visual Studio 2008 中运行 XSLT 调试)
    • 这成功了。我曾尝试结合 exclude-result-prefixes="t" 进行此操作,因为我认为它可以让我不必在每个节点之前添加 t:。有什么办法可以避免这样做吗?
    • 您可以使用 local-name() 匹配元素,例如:template match="/*[local-name()='ArrayOfBrokerage']"
    • 使用 xslt 2.0,您可以在样式表声明中使用 xpath-default-namespace 属性,例如喜欢&lt;xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xpath-default-namespace="http://example.com/some-namespace"&gt; ...
    • 可能值得注意的是嵌套元素也需要命名空间前缀,例如match="/t:Brokerage/t:SomeChild/t:SomeGrandchild"
    猜你喜欢
    • 2015-05-26
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    相关资源
    最近更新 更多