[英]Convert DTD to XSD with defined root (starting) element
我有几个大型DTD文件。 我使用过trang将它们转换为XSD文件,因此可以轻松地从JAXB和其他实用程序中使用它。 但是,生成的XSD文件在顶层具有所有已声明的元素。 这意味着任何元素都可以是输入XML的根元素。 我只想指定一个特定的元素。
具有这些多个根元素会引起一些问题,例如xjc
为所有类生成@XmlRootElement
,因此我需要添加更多其他检查。
据我了解,我需要重写生成的XSD,将<xs:element>
移到<xs:complexType>
,将element ref
更改为element type
s,依此类推,但这将是太多的猴子工作,而没有验证所有操作是否正确的方法。
有没有更有效的方法可以做到这一点?
从您所描述的内容中,并且忽略了一些注释中指出的转换的“保真度”,我只想知道您只是在寻找某种自动(我称之为) XML Schema的方式。重构 。 我与QTAssistant相关联, QTAssistant是用于此类工作的产品,所以这就是我的工作方式……
无论如何,您必须要做的一件事就是找出并捕获您希望以根(或不以根)形式查看的元素列表...完成后:按下按钮或调用命令行,您将确定是否生成了有效的XSD。
重构引擎采用了一种访问者模式,在您的情况下,它实际上满足了您的需要:在需要的地方创建全局类型,删除不需要的全局元素定义,并用内联声明替换所有引用的元素。
(对于任何了解替代组的读者来说,这种重构并不是替代对替代组头的引用;由于我们正在谈论的是DTD的XSD,因此这不是问题。)
这种简单性,以及可重复和可靠的事实,将是使用专门的重构工具的主要优势。 另一个优点:无论如何,它还可以重新分配xml名称空间。
如果您对更多细节感兴趣,请告诉我,我将通过一个小样本和一些插图来更新这篇文章。
我使用了简单的XSLT转换来处理生成的XSD。 适用于我的情况:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
<xsl:template match="@*|node()|comment()">
<xsl:copy>
<xsl:apply-templates select="@*|node()|comment()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="xs:element/@ref"/>
<xsl:template match="xs:element[@ref]">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:attribute name="type"><xsl:value-of select="@ref"/></xsl:attribute>
<xsl:attribute name="name"><xsl:value-of select="@ref"/></xsl:attribute>
</xsl:copy>
</xsl:template>
<xsl:template match="xs:element[@name = //xs:element/@ref and xs:complexType]">
<xs:complexType name="{@name}">
<xsl:apply-templates select="xs:complexType/node()"/>
</xs:complexType>
</xsl:template>
<xsl:template match="xs:element[@name = //xs:element/@ref and @type]">
<xsl:choose>
<xsl:when test="//xs:complexType[@name = current()/@type]">
<xs:complexType name="{@name}">
<xs:complexContent>
<xs:extension base="{@type}"/>
</xs:complexContent>
</xs:complexType>
</xsl:when>
<xsl:otherwise>
<xs:simpleType name="{@name}">
<xs:restriction base="{@type}"/>
</xs:simpleType>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
它检测引用的元素定义,并使它们成为comptexType
,从而更改引用。 所有未引用的元素都将成为开始元素。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.