簡體   English   中英

使用已定義的根(起始)元素將DTD轉換為XSD

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM