当我使用XML示例文件生成XSD时,同时使用Visual Studio和Oxygen,它使用大量<xs:element ref="ELEMENTNAME" />
生成一个文件,其中elementname是实际的元素名称。稍后在文件中,它有一个元素<xs:element name="ELEMENTNAME" type="xs:string" />
,它定义了该元素是什么。例如,这是一段摘录:
<xs:element name="Header">
<xs:complexType>
<xs:sequence>
<xs:element ref="VersionNumber" />
<xs:element ref="BillerGroupID" />
<xs:element ref="BillerGroupShortName" />
<xs:element ref="BillerID" />
<xs:element ref="BillerShortName" />
<xs:element ref="FileIndicator" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="VersionNumber" type="xs:string" />
<xs:element name="BillerGroupID" type="xs:string" />
<xs:element name="BillerGroupShortName" type="xs:string" />
<xs:element name="BillerID" type="xs:string" />
<xs:element name="BillerShortName" type="xs:string" />
<xs:element name="FileIndicator" type="xs:string" />
这是问题 - 我正在使用Microsoft Biztalk,它将每个“Element”标记视为可用模式,因为它们都在根级别 - 标题以及每个子元素。我只想制作一个架构 - 在这种情况下为Header - 并隐藏其余部分。
显而易见的解决方案似乎是手动编辑我的文件,看起来像这样,手动删除REF语句:
<xs:element name="Header">
<xs:complexType>
<xs:sequence>
<xs:element name="VersionNumber" type="xs:string" />
<xs:element name="BillerGroupID" type="xs:string" />
<xs:element name="BillerGroupShortName" type="xs:string" />
<xs:element name="BillerID" type="xs:string" />
<xs:element name="BillerShortName" type="xs:string" />
<xs:element name="FileIndicator" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
但是,由于我的文件庞大且包含数千个元素,因此这并不可行。有没有办法让我的工具在不使用REF的情况下生成文件,而只是将元素的副本放在应该位于根级别的位置?
答案 0 :(得分:3)
如果您有Visual Studio BizTalk项目,可以选择“添加生成的项目..”,然后选择“生成模式”。
在下拉列表中选择“格式良好的xml”,如果在必须运行脚本激活它之前没有人使用该选项,请参阅下面的链接。
VS现在将生成您想要的那种架构。如果VS猜错了,你将不得不调整数据类型:)
查看此人的样本Add generated schemas
答案 1 :(得分:0)
我怀疑编写一个为您执行此转换的XSLT会相对容易。您可以检测ref属性并使用XPath中的值来查找实际定义,然后将其复制到输出。不应该写得很难。
答案 2 :(得分:0)
您使用的是哪个版本的VS?我在Visual Studio 2008中尝试了您的示例,它以您似乎想要的方式生成XSD:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Header">
<xs:complexType>
<xs:sequence>
<xs:element name="VersionNumber" type="xs:string" />
<xs:element name="BillerGroupID" type="xs:string" />
<xs:element name="BillerGroupShortName" type="xs:string" />
<xs:element name="BillerID" type="xs:string" />
<xs:element name="BillerShortName" type="xs:string" />
<xs:element name="FileIndicator" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
看起来VS 2005会做同样的事情。
我浏览了VS选项对话框,但没有看到任何可以控制XSD生成方式的内容。 (也许某处有配置文件?)