2011-01-29 4 views
2

XML:XSLT obtenir une valeur indésirable

<?xml version="1.0" encoding="ISO-8859-1"?> 
    <!DOCTYPE UploadXML SYSTEM "ex_v222.dtd"> 
    <UploadXML><Version>1.1</Version> 
<Properties> 
<Property> 
<IntegratorID>3232321</IntegratorID> 
<IntegratorPropertyID>12312312-3</IntegratorPropertyID> 
<IntegratorOfficeID>1231231231</IntegratorOfficeID>.... 

pour une raison quelconque, le fichier XSL suivant, obtient toujours la valeur 1.1 et le placer avant l'élément d'enveloppe:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
    <xsl:param name="Z">2312</xsl:param> 
    <xsl:param name="A">KKK</xsl:param> 
    <xsl:output method="xml" encoding="utf-8" indent="yes" /> 
     <xsl:strip-space elements="*" /> 

     <xsl:template match='/UploadXML/Properties'> 
     <Envelope> 
     <Body> 
     <add_adverts> 
     <xsl:apply-templates select='Property'/> 
     </add_adverts> 
     </Body> 
     </Envelope> 
     </xsl:template> 

.... (Je crois que la mise en œuvre du modèle est pas important ..)

Ce que je reçois est:

<?xml version="1.0" encoding="utf-8"?> 
1.1<Envelope xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
    <Body> 
    <add_adverts> 
     <advert> 

. . .

Voir cela 1.1 là? Pourquoi? une idée?

Répondre

6

Vous voyez cela parce que c'est le comportement par défaut de XSLT pour un nœud qui ne correspond à aucun modèle. Pour copier pas spécifiquement le contenu de l'élément Version vous pouvez simplement utiliser un modèle vide:

<xsl:template match="Version"/> 
+0

Super! Résolu le problème. La réponse sera acceptée dans 3 minutes (quelque chose avec stackoverflow ..) – snoofkin

2

Vous devez lire sur le modèle de traitement XSLT et comprendre comment XSLT built-in (default) templates sont utilisés.

Le comportement observé est dû au XSLT intégré modèle pour un nœud de texte, qui simplement le copie:

<xsl:template match="text()|@*"> 
    <xsl:value-of select="."/> 
</xsl:template> 

La solution consiste à remplacer ce modèle pour tous les nœuds de texte qui ne devrait pas apparaître dans la sortie avec un modèle qui a un corps vide (ne fait rien et ne copie donc pas le noeud de texte). Dans ce cas:

<xsl:template match="Version/text()"/> 
+0

+1 pour une explication supplémentaire. – Flack

Questions connexes