XSL - Sobre los esquemas en XML

 
Vista:

Sobre los esquemas en XML

Publicado por Yeagob (1 intervención) el 14/01/2003 11:25:38
¿Alguien me puede explicar como se valida un documento XML basado en un esquema .xsd? Porque los validadores que he
encontrado hasta ahora solo me validan documentos basados en DTDs, los que son basados en esquemas, pasan del esquema
y me dicen que falta la Definición de Datos.
Pues eso a ver si alguien conoce un paser que valide esquemas o la declaración adecuada para que cualquier paser valide a partir de
un esquema. Por el momento utilizo este tipo de referencia: <documento xmlns="x-schema:personaSchema.xml"> y no me va...

Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Validar documento XML con esquema .xsd

Publicado por Alejandro (227 intervenciones) el 04/07/2023 23:23:32
Aquí tienes una solución para validar un documento XML basado en un esquema XSD utilizando XSLT. Puedes utilizar esta solución como base para futuras consultas similares:

1. Crear un archivo XSLT llamado "validar-esquema.xsl" con el siguiente contenido:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                exclude-result-prefixes="xsd">
 
  <!-- Definir la ruta del esquema XSD -->
  <xsl:param name="xsdPath" select="'ruta/del/esquema.xsd'"/> <!-- Reemplazar con la ruta correcta hacia tu archivo XSD -->
 
  <!-- Template principal -->
  <xsl:template match="/">
    <!-- Cargar el esquema XSD -->
    <xsl:variable name="schema" select="document($xsdPath)"/>
 
    <!-- Validar el documento XML contra el esquema XSD -->
    <xsl:choose>
      <xsl:when test="document($xsdPath)">
        <xsl:variable name="validationResult">
          <xsl:apply-templates select="." mode="validation"/>
        </xsl:variable>
        <xsl:choose>
          <xsl:when test="$validationResult = ''">
            <xsl:text>El documento XML es válido según el esquema XSD.</xsl:text>
          </xsl:when>
          <xsl:otherwise>
            <xsl:text>Error de validación: </xsl:text>
            <xsl:value-of select="$validationResult"/>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:when>
      <xsl:otherwise>
        <xsl:text>No se pudo cargar el esquema XSD.</xsl:text>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
 
  <!-- Template para la validación -->
  <xsl:template match="*" mode="validation">
    <xsl:variable name="elementName" select="name()"/>
    <xsl:variable name="elementType" select="$schema//xsd:element[@name=$elementName]"/>
 
    <xsl:choose>
      <xsl:when test="$elementType">
        <xsl:apply-templates select="node()" mode="validation"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:text>No se encontró una definición en el esquema para el elemento </xsl:text>
        <xsl:value-of select="$elementName"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
 
  <!-- Template para la validación de atributos -->
  <xsl:template match="@*" mode="validation">
    <xsl:variable name="attributeName" select="name()"/>
    <xsl:variable name="attributeType" select="$schema//@name=$attributeName"/>
 
    <xsl:choose>
      <xsl:when test="$attributeType">
        <!-- No se realiza ninguna validación adicional -->
      </xsl:when>
      <xsl:otherwise>
        <xsl:text>No se encontró una definición en el esquema para el atributo </xsl:text>
        <xsl:value-of select="$attributeName"/>
      </xsl:otherwise>
    </xsl:
 
choose>
  </xsl:template>
</xsl:stylesheet>

2. Utilizar un lenguaje de programación o una herramienta que admita transformaciones XSLT para aplicar el archivo XSLT al XML de entrada. Aquí hay un ejemplo en Python utilizando la biblioteca lxml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from lxml import etree
 
# Cargar el archivo XML
xml_file = "ruta/del/archivo.xml"
tree = etree.parse(xml_file)
 
# Cargar el archivo XSLT
xslt_file = "ruta/del/archivo.xsl"
xslt = etree.parse(xslt_file)
 
# Crear el transformador XSLT
transformer = etree.XSLT(xslt)
 
# Aplicar la transformación al XML
result = transformer(tree)
 
# Obtener el resultado como cadena de texto
validation_result = str(result)
 
# Imprimir el resultado de la validación
print(validation_result)

Asegúrate de reemplazar "ruta/del/esquema.xsd", "ruta/del/archivo.xml" y "ruta/del/archivo.xsl" con las rutas correctas hacia tu archivo XSD, XML y XSLT respectivamente.

Después de ejecutar este código, obtendrás el resultado de la validación del documento XML contra el esquema XSD. Si el documento XML es válido, se imprimirá "El documento XML es válido según el esquema XSD." En caso de que haya errores de validación, se imprimirá un mensaje de error específico.

Espero que esta solución te sea útil.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar