2016-08-30 1 views
0

J'ai du HTML au format XML que j'analyse en utilisant XSLT. Mon HTML ressemble à ceci:Définition de l'ordre des attributs XML via XSLT?

<html> 
<head> 
<meta charset="utf-8" /> 
<title>Test</title> 
</head> 
<body> 
<img height="" width="' src="google.gif?<>" /> 
</body> 
</html> 

Après XSLT, il analyse ressemble à ceci:

<html> 
    <head> 
    <meta charset="utf-8" /> 
    <title>Test</title> 
    </head> 
    <body> 
    <img height="" src="google.gif?<>" width=""/> 
    </body> 
    </html> 

Je veux @src en dernier attribut comme <img height="" width="" src="google.gif?<>" />, mais par des attributs par défaut sont classés par ordre alphabétique. Je ne suis pas capable de le faire en utilisant <xsl:sort>.

+1

Je crains '" /> 'est pas XML bien formé du tout Et bien sûr, nous aurions besoin de voir votre XSLT ainsi que prétendument réassorts. les attributs –

+1

De plus, [l'ordre des attributs est insignifiant selon la Recommandation XML] (http://stackoverflow.com/a/39228435/290085). – kjhughes

Répondre

0

entrée HTML (avec wellformation):

<html> 
<head> 
    <meta charset="utf-8" /> 
    <title>Test</title> 
</head> 
    <body> 
     <img height="13" width="12" src="google.gif?" id="id1"/> 
    </body> 
</html> 

XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="@*|node()"> 
    <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy> 
</xsl:template> 

<xsl:template match="img"> 
    <xsl:copy> 
     <xsl:for-each select="@*[not(name()='src')]"> 
      <xsl:sort select="name()"/> 
      <xsl:attribute name="{name()}"> 
       <xsl:value-of select="."/> 
      </xsl:attribute> 
     </xsl:for-each> 
     <xsl:apply-templates select="@*[name()='src']"/> 
     <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

Résultat:

<html> 
<head> 
    <meta charset="utf-8"/> 
    <title>Test</title> 
</head> 
<body> 
    <img height="13" id="id1" width="12" src="google.gif?"/> 
</body> 
</html> 
+0

Salut, je veux le résultat que test Je veut toujours @src dans le dernier. – user3287034

+0

@ user3287034, édité ma réponse, comme requis, comme suggestion de kjhughes, les attributs peuvent être n'importe quel ordre, mais seulement quand d'autres langages de script (qui ne supportent pas xpath) accèdent ou traitent le xml d'entrée temps, cette position d'attribut peut être utile. –

0

Dans Outre <img height="" width="' src="google.gif?<>" /> pas bien formé comme commented by Martin Honnen ...

Attribute order is insignificant par la XML Recommendation:

Notez que l'ordre des spécifications d'attributs dans une balise de début ou balise d'élément vide n'est pas important.

Par conséquent, XSLT ne fournit aucun moyen de limiter l'ordre des attributs.

Si vous refusez d'accepter cette recommandation d'ignorer la commande d'attributs, voir Martin Honnen's suggestions regarding how to control attribute ordering output pour une question antérieure sur XSLT attribute ordering.

0

XSLT produit en sortie un arbre de résultats conforme au modèle de données XDM et, dans le modèle XDM, les attributs ne sont pas ordonnés. Comme ils n'ont pas de commande, il s'ensuit que les instructions de feuille de style XSLT ne peuvent pas contrôler la commande. La seule possibilité de contrôler l'ordre survient lors de la sérialisation, lorsque les nœuds d'attributs non ordonnés dans l'arbre des résultats sont convertis en une séquence ordonnée de paires nom = "valeur" dans la sortie XML lexicale. Les propriétés de sérialisation standard disponibles dans XSLT (toute version) ne fournissent aucun moyen de contrôler cela. Saxon a cependant un attribut d'extension saxon:attribute-order - voir

http://www.saxonica.com/documentation/index.html#!extensions/output-extras/serialization-parameters