我需要基於XML文件創建XSD架構。有沒有Perl模塊可以做到這一點?如何從Perl中的示例XML文檔創建模式?
6
A
回答
4
您可以使用任何XSLT處理器通過XSL轉換來創建XSD。請參閱XML::XSLT
XSD文件包含兩種元素類型:簡單和複雜。所有的葉子節點必須被翻譯成簡單的類型元素,其他的必須被翻譯成複雜的類型。葉節點是沒有任何後代的節點。相應的XPath是//*[not(descendant::element())]
。下面的XSLT實現了這個計算策略:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xsl:for-each select="//*[not(descendant::element())]">
<xsl:element name="xs:element">
<xsl:attribute name="name">
<xsl:value-of select="name()"/>
</xsl:attribute>
<xs:simpleType>
<xs:restriction base="xs:string"/>
</xs:simpleType>
</xsl:element>
</xsl:for-each>
<xsl:for-each select="//*[descendant::element()]">
<xsl:element name="xs:element">
<xsl:attribute name="name">
<xsl:value-of select="name()"/>
</xsl:attribute>
<xs:complexType>
<xs:sequence>
<xsl:for-each select="child::*">
<xsl:element name="xs:element">
<xsl:attribute name="ref">
<xsl:value-of select="name()"/>
</xsl:attribute>
</xsl:element>
</xsl:for-each>
</xs:sequence>
</xs:complexType>
</xsl:element>
</xsl:for-each>
</xs:schema>
</xsl:template>
</xsl:stylesheet>
下面的例子:
<?xml version="1.0" encoding="UTF-8"?>
<person>
<firstname>Peter</firstname>
<lastname>Pan</lastname>
<born>
<year>1904</year>
<month>12</month>
<day>27</day>
</born>
</person>
將產生如下模式:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:element name="firstname">
<xs:simpleType>
<xs:restriction base="xs:string"/>
</xs:simpleType>
</xs:element>
<xs:element name="lastname">
<xs:simpleType>
<xs:restriction base="xs:string"/>
</xs:simpleType>
</xs:element>
<xs:element name="year">
<xs:simpleType>
<xs:restriction base="xs:string"/>
</xs:simpleType>
</xs:element>
<xs:element name="month">
<xs:simpleType>
<xs:restriction base="xs:string"/>
</xs:simpleType>
</xs:element>
<xs:element name="day">
<xs:simpleType>
<xs:restriction base="xs:string"/>
</xs:simpleType>
</xs:element>
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element ref="firstname"/>
<xs:element ref="lastname"/>
<xs:element ref="born"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="born">
<xs:complexType>
<xs:sequence>
<xs:element ref="year"/>
<xs:element ref="month"/>
<xs:element ref="day"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
相關問題
- 1. 如何在Perl中創建XML模板?
- 2. 如何創建將出現在Eclipse工具提示中的XML模式文檔?
- 3. 從XML創建Lucene文檔
- 4. 如何在Silverlight中創建XML文檔
- 5. 如何從Perl的幾個文件創建一個HTML文檔?
- 6. JiBX:如何在JiBX的幫助下基於xml文檔創建xml模式(xsd)?
- 7. 從Perl哈希構建XML模式?
- 8. 從xml文檔創建Xslt的錨定
- 9. 從頭創建XML文檔與ElementTree的
- 10. xml文檔的創建
- 11. 如何使用XmlDocument創建XML文檔?
- 12. 如何在python創建XML文檔
- 13. C#xml文檔:如何創建Notes?
- 14. XML文檔中的多語言示例
- 15. 創建一個XML文檔「SAX樣式」?
- 16. 創建示例文檔預覽
- 17. 使用Netbeans從XSD創建示例XML
- 18. 從節點創建Xml文檔
- 19. 從php頁面創建XML文檔
- 20. 從SQL查詢創建XML文檔
- 21. 從InputStream創建一個xml文檔
- 22. 從字典創建XML文檔問題
- 23. 如何編寫這個XML文檔是一個有效實例的XML模式?
- 24. 在Java中使用XSD創建XML文檔的實例
- 25. 從C++中的XML模式生成XML文檔
- 26. 動態創建XML文檔
- 27. 用PHP創建XML文檔
- 28. 建模XML文檔爲
- 29. 如何從Perl中的JSON字符串創建XML?
- 30. 如何以編程方式在Google文檔中創建文檔?
與此相關的問題:對於一個Java工具,見[莊](http://www.thaiopensource.com/relaxng/trang-manual.html#xsd-output)。相反的方向,請參閱[XML-Pastor](http://p3rl.org/XML::Pastor)。 – daxim 2011-04-20 10:21:10
由XML文件生成的XSD文件沒有太大價值。只能對XML文件的結構進行建模。 XSD文件將錯過任何限制,因爲您無法猜測2011年是一年,因此無法定義任何限制。僅建模結構的XSD文件是否會滿足您的要求? – ceving 2011-05-04 09:17:47