2

我在这里有一个扁平的 XSD:http: //pastebin.com/tQVSH9Jp

我有一个“替代”XSLT 脚本,我正在针对它运行它来修复 XSD.exe(它忽略引用的元素),但是生成的 XSD 缺少一些属性。(ID不存在于UniqueID_Type)。

任何人都可以提供一个 XSLT 脚本来正确执行这些替换,甚至完全提供另一种解决方案吗?

4

1 回答 1

3

有趣的是,有人建议自己编写 xsd.exe,并且还要依赖 XmlSchemaImporter... 一方面,我认为这不是一件容易的事;其次,缺少属性的问题来自XmlSchemaImporter;ImportAttributeGroupMembers 中有一个错误:它不是在寻找 XmlSchemaAttributeGroupRef,而是在检查 XmlSchemaAttributeGroup(摘录如下,由 Reflector 提供):

private void ImportAttributeGroupMembers(XmlSchemaAttributeGroup group, string identifier, CodeIdentifiers members, CodeIdentifiers membersScope, string ns)
{
    for (int i = 0; i < group.Attributes.Count; i++)
    {
        object obj2 = group.Attributes[i];
        if (obj2 is XmlSchemaAttributeGroup)
        {
            ...
        }
        else if (obj2 is XmlSchemaAttribute)
        {
           ...
        }
     }
     ...
}

有一个类似的实用程序,xsd2code,在进入 XML 模式重构 (XSR) 之前,我会尝试使用原始 XSD。

如果你想走这条路,我推荐XSR 的QTAssistant(我与之相关)。我已经用最新版本 (4.0.21) 尝试了你的 XSD,它工作正常。我已经在这里发布了结果。

使用 XSD.exe 为您指出有缺陷的片段生成的代码(我只是显示字段)现在显示 ID 属性的 idField:

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.opentravel.org/OTA/2003/05")]
public partial class UniqueID_Type {

    private CompanyNameType companyNameField;

    private string uRLField;

    private string typeField;

    private string instanceField;

    private string idField;

    private string iD_ContextField;

    ...
}

特定于您的设置的是必须设置为 true 的 InlineAttributeGroups:

QTAssistant 设置 InlineAttributeGroups

如果您对有关使用 QTAssistant 进行重构的更多详细信息感兴趣,请查看这篇文章,同样是关于 SO。无论如何,我已经发布了整个重构模式,请随意使用它......

于 2012-04-12T02:25:56.790 回答