How can I create a schema from an XML example document in Perl?

I need to create an XSD schema based on an XML file. Are there any Perl modules that can do this?

+6
source share
1 answer

You can create an XSD by converting XSL using any XSLT processor. See XML :: XSLT

An XSD file contains two types of elements: simple and complex. All nodes of the sheet must be converted to simple type elements, while others must be converted to complex types. Leaf nodes are nodes without any descendants. The corresponding XPath is //*[not(descendant::element())] . The following XSLT implements this approach:

 <?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> 

The following example:

 <?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> 

Print the following diagram:

 <?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> 
+4
source

Source: https://habr.com/ru/post/886236/


All Articles