我在这里有一个扁平的 XSD:http: //pastebin.com/tQVSH9Jp
我有一个“替代”XSLT 脚本,我正在针对它运行它来修复 XSD.exe(它忽略引用的元素),但是生成的 XSD 缺少一些属性。(ID
不存在于UniqueID_Type
)。
任何人都可以提供一个 XSLT 脚本来正确执行这些替换,甚至完全提供另一种解决方案吗?
我在这里有一个扁平的 XSD:http: //pastebin.com/tQVSH9Jp
我有一个“替代”XSLT 脚本,我正在针对它运行它来修复 XSD.exe(它忽略引用的元素),但是生成的 XSD 缺少一些属性。(ID
不存在于UniqueID_Type
)。
任何人都可以提供一个 XSLT 脚本来正确执行这些替换,甚至完全提供另一种解决方案吗?
有趣的是,有人建议自己编写 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 进行重构的更多详细信息感兴趣,请查看这篇文章,同样是关于 SO。无论如何,我已经发布了整个重构模式,请随意使用它......