Voici la pleine stylesheet dont vous avez besoin (car les espaces de noms sont importants):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:z="foo">
<xsl:template match="root">
<root>
<xsl:apply-templates />
</root>
</xsl:template>
<xsl:template match="z:row">
<xsl:variable name="A" select="@A" />
<xsl:for-each select="@*[local-name() != 'A']">
<z:row A="{$A}">
<xsl:attribute name="{local-name()}">
<xsl:value-of select="." />
</xsl:attribute>
</z:row>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Je préfère l'utilisation d'éléments de résultat littéral (par exemple <z:row>
) plutôt que <xsl:element>
et les gabarits de valeur d'attribut (ceux {}
s dans les valeurs d'attribut) plutôt que <xsl:attribute>
lorsque cela est possible car cela rend le code plus court et facilite la visualisation de la structure de le document de résultat que vous générez. D'autres préfèrent <xsl:element>
et <xsl:attribute>
parce que tout est une instruction XSLT.
Si vous utilisez XSLT 2.0, il y a quelques subtilités syntaxiques qui aident, à savoir l'opérateur except
dans XPath et la possibilité d'utiliser un attribut select
directement sur <xsl:attribute>
:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
xmlns:z="foo">
<xsl:template match="root">
<root>
<xsl:apply-templates />
</root>
</xsl:template>
<xsl:template match="z:row">
<xsl:variable name="A" as="xs:string" select="@A" />
<xsl:for-each select="@* except @A">
<z:row A="{$A}">
<xsl:attribute name="{local-name()}" select="." />
</z:row>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
J'aime le { } syntaxe. Pouvez-vous me montrer quelques docs sur leur utilisation? J'ai du mal à affiner quoi que ce soit de significatif –