2010-07-27 14 views
3

Je suis en train de transformer un fichier xml pour sortir un autre fichier xml, et j'ai besoin que l'attribut "compte" soit affiché de la même manière que ci-dessous. J'ai un tas de ces valeurs dans le fichier, la plupart ne fonctionnent pas.XSLT convertit mes attributs hexadécimaux en quelque chose d'autre, comment puis-je l'arrêter?

Pour les valeurs de compte comme 0x0406, la sortie est 0.0.06. Mais pour des valeurs comme 0x002d, il les laisse tranquilles et ils se présentent comme je le souhaite.

Des idées?

XML initial:

<?xml version="1.0" encoding="UTF-8"?> 
... 
<foo account="0x0406" other-stuff="blah" something-name="blah again"/> 
... 

Ceci est mon modèle xslt:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
    xmlns:user="http://some-internal-thing/user"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="yes"/> 
... 
<xsl:attribute name="account"><xsl:value-of select="@account"/></xsl:attribute> 
... 
+1

Cela semble très étrange. XSLT doit toujours gérer les valeurs d'attribut en tant que chaînes de caractères à moins qu'il ne soit demandé de faire autre chose. Je ne pense pas que l'erreur soit dans la partie que vous avez collée. –

+2

Cela ne semble pas correct, pouvez-vous nous donner un exemple complet (petit) et des instructions étape par étape pour reproduire ce résultat? – Dan

+2

Veuillez également indiquer quelle implémentation XSLT vous utilisez. –

Répondre

2

Le problème décrit ne peut pas être reproduit.

I ont exécuter la transformation suivante avec 10 différents processeurs XSLT (MSXML3, Msxml4, MSXML6, XslTransform .NET, XslCompiledTransform .NET, AltovaXML (pour XSLT 1.01.0), Saxon6.5.4, Saxon 1.9.07, Saxon 9.1.07.NET et XML-SPY-XSLT2.0) et produisent tous le même résultat correct.

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
    xmlns:user="http://some-internal-thing/user"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="yes"/> 

<xsl:template match="/*"> 
    <xsl:copy> 
    <xsl:attribute name="account"><xsl:value-of select="@account"/></xsl:attribute> 
    </xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 

lorsque cette transformation est effectuée sur le document XML suivant:

<?xml version="1.0" encoding="UTF-8"?> 
<foo account="0x0406" other-stuff="blah" something-name="blah again"/> 

le résultat attendu, correct produit:

<foo account="0x0406" /> 

Si votre processeur XSLT est pas un de ceux-ci et vous vraiment obtenir un mauvais résultat, c'est un bug et devrait être signalé aux vendeurs.

+0

Wow, 10 processeurs XSLT différents - J'aimerais avoir ce genre de temps entre les mains. Merci pour la confirmation, il m'a fait regarder tout le reste en dehors de XSLT, et il s'avère que j'avais déjà touché le fichier XML plus tôt dans mon processus et remplacé la chaîne littérale 0.0.0, qui bien sûr n'était pas cité, et donc il remplaçait cette regex. Je déteste l'héritage du code. – wonderfulthunk

+0

@wonderfulthunk: Je suis content que cela ait aidé. Croyez-moi ou non, mais cela m'a pris seulement 2-3 minutes. J'utilise un IDE XSLT qui permet d'effectuer n'importe quelle transformation avec n'importe quel processeur XSLT (déjà installé) en un ou deux clics. –

0

Pouvez-vous essayer de changer le codage? Par exemple "ASCII" au lieu de "UTF-8".

+0

Les gens utilisent encore ASCII? En ce jour et l'âge? –

+0

Ou supprimez simplement l'encodage de la déclaration XML source et laissez le moteur XSLT détecter. Peut-être que votre fichier source n'est pas UTF-8. – Jacob

+0

Je ne pouvais pas essayer ASCII, j'ai des caractères Unicode dans mon fichier XML et j'ai des erreurs en essayant ASCII. – wonderfulthunk