2017-03-08 63 views
1

在本主題中,我想要求比我自己提供的更多的腦細胞。我想根據實際XML實例中使用/未使用的元素(僅限單個命名空間)重構我的XSD(v1.0)。讓我們建立了一個小場景報告相應模式的所有未使用元素(+屬性)

我對相應的模式只有有效的XML文檔:

<body> 
    <h1>Heading 1</h1> 
    <p>paragraph</p> 
    <p><bold>bold</bold>paragraph<italic>italic</italic></p> 
</body> 

XSD來驗證:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <xs:element name="body"> 
    <xs:complexType> 
     <xs:choice maxOccurs="unbounded"> 
     <xs:element ref="h1"/> 
     <xs:element ref="h2"/> 
     <xs:element ref="p"/> 
     <xs:element ref="span"/> 
     </xs:choice> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="h1" type="xs:string"/> 
    <xs:element name="h2" type="xs:string"/> 
    <xs:element name="p"> 
    <xs:complexType mixed="true"> 
     <xs:choice minOccurs="0" maxOccurs="unbounded"> 
     <xs:element ref="bold"/> 
     <xs:element ref="italic"/> 
     <xs:element ref="underline"/> 
     </xs:choice> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="span"> 
    <xs:complexType mixed="true"> 
     <xs:choice minOccurs="0" maxOccurs="unbounded"> 
     <xs:element ref="bold"/> 
     <xs:element ref="italic"/> 
     <xs:element ref="underline"/> 
     </xs:choice> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="bold" type="xs:NCName"/> 
    <xs:element name="italic" type="xs:NCName"/> 
    <xs:element name="underline" type="xs:NCName"/> 
</xs:schema> 

在此基礎上,我會喜歡在我的XML實例中使用關於哪些元素(標記+屬性)爲NOT來創建報告(通過XSLT [2.0,3.0,通過SAXON EE 9.6.0.5提供])b ut可能在我的XSD中。

簡化僞待辦事項/從頭開始:

  • 搜索所有//xs:element[@name]在我的XSD(屬性在報告V2.0跟隨)。
  • 搜索我的XML
  • 所有* 「比較」 是

問題:

有什麼超出了我的視野有關此主題的可愛的XSLT社會了嗎?

如何以良好的方式進行存儲和比較?

通過XSLT 3.0使用xsl:map?存儲路徑[/body/h1,/body/p]並比較這些路徑? (技巧:走出架構的正確路徑,處理的定義所有的方法,像xs:group ref="..."或通過complexTypes等)

[附加元件:也許我必須將它延伸到我的XML祖先元素的背景。在這個例子中的情況下,我可能要 區分//p/underline//span/underline之間。]

<xsl:message>please write your thoughts open minded. I don't request for fully functional code!</xsl:message>

回答

1

查找到http://saxonica.com/html/documentation/functions/saxon/type.htmlhttp://saxonica.com/html/documentation/functions/saxon/schema.html獲得模式類型信息撒克遜EE您的節點上,也就是希望一個比較方法您的實例到模式。我從來沒有使用過,所以我不確定你會得到多遠,我相信如果你添加到你的問題,那麼邁凱將在適當的時候給你一些更好的見解。

+1

感謝迄今爲止,爲凱博士添加了標籤。 – uL1

1

你的帖子提醒我關於com.saxonica.Validate命令的一個選項:通過指定-stats:report.xml你應該得到關於實例文檔中模式組件使用情況的報告。這似乎在9.7將無法正常工作(我已經提出了對錯誤),但與9.5你得到如下形式的報告:

<schemaCoverage> 
    <component kind="element" namespace="" name="PUB-DATE" count="6"/> 
    <component kind="complexType" namespace="" name="weightType" count="6"/> 
    <component kind="element" namespace="" name="PUBLISHER" count="6"/> 
    <component kind="element" namespace="" name="AUTHOR" count="6"/> 
    <component kind="element" namespace="" name="DIMENSIONS" count="6"/> 
    <component kind="simpleType" namespace="" name="languageType" count="6"/> 
    <component kind="element" namespace="" name="QUANTITY" count="6"/> 
    <component kind="element" namespace="" name="CATEGORY" count="3"/> 
    <component kind="complexType" 
       namespace="http://ns.saxonica.com/anonymous-type" 
       name="CATEGORIES_anonymous_type_1_at_line_23_of_books.xsd" 
       count="1"/> 
    <component kind="element" namespace="" name="LANGUAGE" count="6"/> 
    <component kind="element" namespace="" name="PAGES" count="6"/> 
    <component kind="complexType" namespace="" name="moneyType" count="6"/> 
    <component kind="element" namespace="" name="ISBN" count="6"/> 
    <component kind="simpleType" 
       namespace="http://www.w3.org/2001/XMLSchema" 
       name="IDREF" 
       count="6"/> 
    <component kind="simpleType" 
       namespace="http://www.w3.org/2001/XMLSchema" 
       name="ID" 
       count="3"/> 
    <component kind="complexType" 
       namespace="http://ns.saxonica.com/anonymous-type" 
       name="BOOKS_anonymous_type_1_at_line_14_of_books.xsd" 
       count="1"/> 
    <component kind="element" namespace="" name="CATEGORIES" count="1"/> 
    <component kind="simpleType" namespace="" name="ISBNType" count="6"/> 
    <component kind="simpleType" 
       namespace="http://www.w3.org/2001/XMLSchema" 
       name="string" 
       count="22"/> 
    <component kind="complexType" 
       namespace="http://ns.saxonica.com/anonymous-type" 
       name="ITEM_anonymous_type_1_at_line_39_of_books.xsd" 
       count="6"/> 
    <component kind="simpleType" namespace="" name="weightUnitType" count="6"/> 
    <component kind="complexType" 
       namespace="http://ns.saxonica.com/anonymous-type" 
       name="CATEGORY_anonymous_type_1_at_line_31_of_books.xsd" 
       count="3"/> 
    <component kind="simpleType" 
       namespace="http://www.w3.org/2001/XMLSchema" 
       name="date" 
       count="6"/> 
    <component kind="simpleType" 
       namespace="http://www.w3.org/2001/XMLSchema" 
       name="integer" 
       count="12"/> 
    <component kind="element" namespace="" name="TITLE" count="6"/> 
    <component kind="element" namespace="" name="PRICE" count="6"/> 
    <component kind="element" namespace="" name="WEIGHT" count="6"/> 
    <component kind="complexType" namespace="" name="dimensionsType" count="6"/> 
    <component kind="element" namespace="" name="ITEM" count="6"/> 
    <component kind="simpleType" namespace="" name="lengthUnitType" count="6"/> 
    <component kind="element" namespace="" name="BOOKS" count="1"/> 
</schemaCoverage> 

這似乎是你正在尋找什麼。

1

我爲XSLT 3.0測試套件做了一個這樣的練習。您可以在這裏找到樣式表:

https://dvcs.w3.org/hg/xslt30-test/file/24e8b98b044b/tests/misc/catalog/catalog-007.xsl

它有兩個輸入端:

(a)使用com.saxonica.Validate與-scmout選項生成的文件SCM,適用於架構的-xslt30。 SCM文件是編譯模式的表示,從XSLT分析比原始源模式容易得多

(b)測試套件中的一組非錯誤樣式表,通過搜索測試元數據獲得目錄遞歸。

它提取模式允許的一組元素名稱/屬性名稱對,然後提取樣式表中實際存在的一組元素名稱/屬性名稱對(在每種情況下都進行了過濾,例如考慮只有XSLT名稱空間中的元素)。然後,它比較這兩個列表,並報告架構允許的,不在測試樣式表中的任何對,以及架構不允許的測試樣式表中存在的任何對。只有兩個列表都爲空時,測試纔會通過。

相關問題