代码之家  ›  专栏  ›  技术社区  ›  Bambax

如何确定给定的DTD是否是另一个DTD的子集?

  •  1
  • Bambax  · 技术社区  · 14 年前

    我需要验证“简化”DTD是否真的是较大DTD的子集,即根据“简化”DTD有效的文档也将始终根据较大(或“主”)DTD有效。

    现在正在编写简化的DTD—它是从主DTD派生的(如果是另一种方式,可以简单地将较小的DTD包含到较大的DTD中)。

    如何确定简化的DTD是否派生自主DTD?

    1 回复  |  直到 10 年前
        1
  •  2
  •   Ira Baxter    14 年前

    你也许能回答这样一个问题:G1的结构是否能证明L(G1)是L(G2)的一个子集,方法是证明G1的每个元素与G2的每个元素兼容,最重要的是证明每个语法规则 在G1中,在G2中有一个相应的规则,其中删除了元素。您对dtd进行diffing的想法似乎是沿着这条线的,附带的条件是,如果diffs很大,那么您就只能处理一般的问题,而不是简单的问题。至少你描述问题的方式(G2来自主DTD)我认为你有机会。 差异的目的是通过找出最小的差异来确定兼容的规则。

    你想检查一下, 在G2中派生的令牌字符串。这看起来就像比较两个语言的原始无约束问题;我们现在只是比较两个规则g1和g2的子语言。

    所以现在我认为你必须坚持g1可以到达的每个子规则在结构上与g2中相应的子规则兼容,这样才能使它实用。

    另一方面,我的公司 Smart Differencer

    编辑:我尝试了以下两种DTD,一种来自另一种:

    订单格式.xml :

    <?xml version='1.0' ?>
    <!DOCTYPE orderform [
    
    <!ELEMENT orderform (name,company,address,items) >
    <!ELEMENT name ( firstname, lastname )>
    <!ELEMENT firstname ( #PCDATA )>
    <!ELEMENT lastname ( #PCDATA )>
    <!ELEMENT company ( #PCDATA )>
    <!ELEMENT address ( street, city, country )>
    <!ELEMENT street ( #PCDATA )>
    <!ELEMENT city( #PCDATA )>
    <!ELEMENT country ( zipcode | nation )>
    <!ELEMENT zipcode ( #PCDATA )>
    <!ELEMENT nation ( #PCDATA )>
    <!ELEMENT items (item)+ >
    <!ELEMENT item ( partnumber, quantity, unitprice)>
    <!ELEMENT partnumber ( #PCDATA )>
    <!ELEMENT quantity ( #PCDATA )>
    <!ELEMENT unitprice  ( #PCDATA )>
    ]>
    
    <done/>
    

    orderform2.xml文件 :

    <?xml version='1.0' ?>
    <!DOCTYPE orderform [
    
    <!ELEMENT orderform (name,company,location,item) >
    <!ELEMENT name ( firstname, lastname )>
    <!ELEMENT firstname ( #PCDATA )>
    <!ELEMENT lastname ( #PCDATA )>
    <!ELEMENT company ( #PCDATA )>
    <!ELEMENT location ( street, city, country )>
    <!ELEMENT street ( #PCDATA )>
    <!ELEMENT city( #PCDATA )>
    <!ELEMENT country ( zipcode | nation )>
    <!ELEMENT zipcode ( #PCDATA )>
    <!ELEMENT nation ( #PCDATA )>
    <!ELEMENT item ( partnumber, unitprice)>
    <!ELEMENT partnumber ( #PCDATA )>
    <!ELEMENT quantity ( #PCDATA )>
    <!ELEMENT unitprice  ( #PCDATA )>
    ]>
    
    <done/>
    

    [先看看你自己是否能发现差异:-)

    C:\DMS\Domains\XML\Analyzers\SmartDifferencer\Source>DMSSmartDifferencer XML -SuppressSourceCodeForRenamings C:\DMS\Domains\XML\Tool
    s\DTD2COBOL\orderform.xml C:\DMS\Domains\XML\Tools\DTD2COBOL\orderform2.xml
    Copyright (C) 2009 Semantic Designs; All Rights Reserved
    XML SmartDifferencer Version 1.1.1
    Copyright (C) 2009 Semantic Designs, Inc; All Rights Reserved; SD Confidential
    Powered by DMS (R) Software Reengineering Toolkit
    *** Unregistered SmartDifferencer Version 1.1
    *** Operating with evaluation limits.
    
    *** Parsing file C:/DMS/Domains/XML/Tools/DTD2COBOL/orderform.xml ...
    *** Parsing file C:/DMS/Domains/XML/Tools/DTD2COBOL/orderform2.xml ...
    *** Creating suffix tree ...
    *** Determining maximal pairs ...
    *** Sorting maximal pairs ...
    *** Determining differences ...
    *** Printing edits ...
    Rename 4.1-9.44 to 4.1-9.45 with 'address'->'location' and 'items'~>'item'
    Delete 15.1-15.25 merging 15.18-15.21 into 4.44-4.47
    <<!ELEMENT items (item)+ >
    Delete 16.30-16.38 merging 16.30-16.38 into 15.18-15.28 with 'quantity'~>'partnumber'
    <                             quantity,
    

    是的,我就是这么做的(符号N.M表示“第N行,第M列”)。