【问题标题】:XSL Stylesheet won't parse XML generated by DataContractSerializerXSL 样式表不会解析由 DataContractSerializer 生成的 XML
【发布时间】:2009-04-06 18:37:49
【问题描述】:

我使用 XMLSerializer 序列化了一些类,然后使用 XSLT 将其转换为各种格式的电子邮件或 Web 服务调用。一切都很好。

我们开始在数据层的某些部分使用 Linq,我需要序列化一些 Linq 对象以供 XSL 样式表使用。我认为最好还是使用 DataContractSerializer 而不是 XMLSerializer。

我设置了 DataContracts 和所有东西,并且通过对实体名称进行一些小的更改来很好地序列化......但是现在样式表根本不会处理 XML。我真的不知道为什么我至少没有得到一些东西......基本上所有出来的都是从 xsl 标签中剥离的数据。

有什么想法会导致这种情况吗?

编辑:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="CallTicket">

这是在我修改 DataContract 声明之前从 DataContractSerializer 生成的 XML:

<CallTicket xmlns="http://schemas.datacontract.org/2004/07/CRMInterface.CRMData" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">

【问题讨论】:

    标签: .net xslt datacontractserializer


    【解决方案1】:

    您很可能遇到了命名空间问题。例如:

    如果 XML 看起来像这样

    &lt;Root xmls="http://www.example.org/1" ....

    &lt;test&gt;one&lt;/test&gt;

    那么你必须在 XSLT 中做两件事之一

    具体引用命名空间并相应地使用前缀

    <xsl:stylesheet xmlns:ex="http://www.example.org/1" ....>`
       ...
    
        <myTag><xsl:select value-of="//ex:test"/></myTag>`
    

    如果只有一个命名空间,则将其设为 XSLT 文件的默认命名空间:

    <xsl:stylesheet xmlns="http://www.example.com/1" ...`
    
    ...
       <myTag><xsl:select value-of="//test"/></myTag>`
    

    【讨论】:

      【解决方案2】:

      可能是您的新 XML 中包含 XML 名称空间,而您的 XSLT 没有正确处理?

      您能否向我们展示您的 XML 和 XSLT 文件的相关部分?

      马克

      【讨论】:

      • 是的,可能。如何正确处理命名空间?我将在 xsl 声明中进行编辑...
      • 如果您的 XML 中有 XML 命名空间,您将需要在 XSLT 中进行相同的声明,并且您需要使用 xmlns:xy 前缀来限定您的元素。
      • 我不认为您可以控制 LINQ 实体使用的命名空间?它似乎在 .designer.cs 文件中被硬编码,无法从设计器中访问它...
      • 不,您不能更改它 - XML 命名空间是固定的 - 它是描述 LINQ dbml 文件的 XML 的命名空间。它总是 xmlns="schemas.microsoft.com/linqtosql/dbml/2007" - 这很容易 - 您只需将此命名空间添加到您的 XSLT 就可以了 :-)
      【解决方案3】:

      我想我明白了,命名空间比我意识到的更重要。如果我为每个被序列化的类设置 DataContractAttribute(Namespace="") ,它就可以工作。我还有一些与 linq 实体有关的工作......但在正确的轨道上。

      唯一让我感动的是 xslt 文件中没有对命名空间的引用...

      【讨论】:

      • 如果没有引用,那么您需要将其作为属性添加到您的 xsl:stylesheet 元素中。请参阅我提出的答案中的示例
      • 不要清除命名空间,而是将其设置为真实的东西,然后在 XSL 中使用该命名空间。 XML 元素由本地名称 + 命名空间的组合标识。通过清除命名空间,您更有可能发生名称冲突。
      • 通过设置它,我必须更新几十个预先存在的样式表。 :P 我怀疑这一切都会在我自己的代码之外被消耗掉......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-07
      • 2017-08-22
      • 2012-04-03
      • 1970-01-01
      • 2014-12-20
      • 2012-04-01
      相关资源
      最近更新 更多