Necesito crear un esquema XSD basado en un archivo XML. ¿Hay algún módulo de Perl que pueda hacer esto?¿Cómo puedo crear un esquema a partir de un documento XML de ejemplo en Perl?
Respuesta
Puede crear el XSD mediante una transformación XSL utilizando cualquier procesador XSLT. Ver XML::XSLT
Un archivo XSD contiene dos tipos de elementos: simple y complejo. Todos los nodos de hoja deben traducirse en elementos de tipo simple y los demás deben traducirse a tipos complejos. Los nodos de hojas son nodos sin ningún descendiente. El XPath correspondiente es //*[not(descendant::element())]
. La siguiente XSLT implementa este approch:
<?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>
el siguiente ejemplo:
<?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>
producirá el siguiente esquema:
<?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>
¡Funciona para mí! Como en realidad no está utilizando ninguna de las características de XSLT 2.0, podría ir a la versión 1.0 de mayor extensión. Solo tendrías que cambiar 'descenddant :: element()' por 'descenddant :: *'. – Lumi
Consulte también [XML :: LibXSLT] (http://search.cpan.org/~pajas/XML-LibXSLT/), que es su mejor opción en Perl al hacer XSLT. – Lumi
- 1. ¿Cómo puedo crear un documento xml basado en un esquema usando php?
- 2. ¿Alguna herramienta para generar un esquema XSD a partir de un documento de instancia XML?
- 3. ¿Cómo crear un documento XML a partir de un objeto .NET?
- 4. ¿Cómo puedo generar programáticamente un esquema xml a partir de un tipo?
- 5. Generar esquema de Json a partir del esquema XML (XSD)
- 6. ¿Cómo crear un documento XML utilizando XmlDocument?
- 7. Recursividad en un esquema XML?
- 8. Generación de instancias XML a partir del esquema XML (xsd)
- 9. Cómo crear un conjunto de datos a partir de un esquema xsd en Visual Studio 2010
- 10. ¿Existe una clase para generar un documento XML de muestra a partir del esquema XSD en .NET
- 11. Usar un esquema para reordenar los elementos de un documento XML de conformidad con el esquema
- 12. ¿Cómo crear XML a partir de XML utilizando XSL?
- 13. ¿Cómo puedo crear XML desde Perl?
- 14. ¿Cómo puedo cargar un documento a SharePoint con Perl?
- 15. ¿Agregar un documento xml a un nodo xml en C#?
- 16. cómo generar XML a partir de un esquema XML en Java y datos de fuentes en él?
- 17. ¿Qué herramientas accesibles de Python puede usar para generar XSD a partir de un documento XML?
- 18. ¿Cómo generar código Pascal a partir de un esquema XML en Delphi Prism?
- 19. Cómo construir una base de datos a partir de un esquema XSD e importar datos XML
- 20. Convirtiendo un documento XML a un diccionario
- 21. cómo crear un InputStream desde un documento o nodo
- 22. Cómo crear un objeto XML a partir de String en Java?
- 23. ¿Cómo puedo crear una tabla SQL a partir de un archivo XML que tendrá un número dinámico de nodos?
- 24. ¿Hay alguna herramienta para generar un esquema JSON desde un esquema XML a través de Java?
- 25. ¿VS2010 tiene un validador de esquema xml?
- 26. ¿Puedo validar una expresión XPath contra un esquema XML?
- 27. ¿Cómo construir un documento XML en Java de forma concisa?
- 28. ¿Cómo crear un documento XPS?
- 29. crear documentos XML a partir de la consulta SQL
- 30. ¿Cómo puedo clonar un documento XML, en Javascript?
relacionada a esta pregunta: para una herramienta de Java, consulte [Trang ] (http://www.thaiopensource.com/relaxng/trang-manual.html#xsd-output). Para la dirección inversa, vea [XML-Pastor] (http://p3rl.org/XML::Pastor). – daxim
Un archivo XSD generado por un archivo XML no tiene mucho valor. Solo se puede modelar la estructura del archivo XML. El archivo XSD no incluirá ninguna restricción, ya que no puede adivinar que 2011 es un año y, por lo tanto, no es posible definir ninguna restricción. ¿Un archivo XSD que modele solo la estructura satisfaga sus requisitos? – ceving