Pregunta

Estoy tratando de canonizar la representación de algunos datos XML ordenando los atributos de cada elemento por nombre (no valor). La idea es mantener las diferencias textuales mínimas cuando se agregan o eliminan atributos y evitar que diferentes editores introduzcan variantes equivalentes. Estos archivos XML están bajo control de origen y los desarrolladores desean diferenciar los cambios sin recurrir a herramientas XML especializadas.

Me sorprendió no encontrar un ejemplo XSL de cómo hacerlo. Básicamente quiero solo la transformación de identidad con atributos ordenados. Se me ocurrió lo siguiente que parece funcionar en todos mis casos de prueba:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
  <xsl:template match="*|/|text()|comment()|processing-instruction()">
    <xsl:copy>
    <xsl:for-each select="@*">
        <xsl:sort select="name(.)"/>
        <xsl:copy/>
      </xsl:for-each>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

Como XSL n00b total agradecería cualquier comentario sobre estilo o eficiencia. Pensé que podría ser útil publicarlo aquí, ya que parece que al menos no es un ejemplo común.

¿Fue útil?

Solución

Dado que xslt es un lenguaje funcional, el hacer para cada uno a menudo podría ser el camino más fácil para nosotros los humanos, pero no el más eficiente para los procesadores XSLT, ya que no pueden optimizar completamente la llamada.

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
  <xsl:template match="*">
    <xsl:copy>
      <xsl:apply-templates select="@*">
        <xsl:sort select="name()"/>
      </xsl:apply-templates>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="@*|comment()|processing-instruction()">
    <xsl:copy />     
  </xsl:template>
</xsl:stylesheet>

Sin embargo, esto es totalmente trivial a este respecto y como "XSL n00b" Creo que resolvió el problema muy bien.

Otros consejos

Bien hecho para resolver el problema. Como supongo que usted sabe que el orden o los atributos no son importantes para los analizadores XML, por lo que el beneficio principal de este ejercicio es para los humanos: una máquina los reordenará de entrada o salida de manera impredecible.

La canonización en XML no es trivial y le recomendamos utilizar el canonicalizador provisto con cualquier kit de herramientas XML razonable en lugar de escribir el suyo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top