2016-05-11 2 views
0

J'ai les questions ou problèmes suivants avec mon xsl ci-dessous. J'ai inclus ma sortie actuelle, le xml et le xsl. J'ai des problèmes en essayant d'enlever la 2ème ligne contenant les doubles guillemets. Je suppose qu'il vient du noeud de schéma.

1) la version la plus proche de mon xsl met une ligne invalide entre les en-têtes et les données comme montré dans l'exemple ci-dessous.
2) J'ai essayé d'insérer ce gabarit avant le 2ème gabarit pour supprimer la ligne vide causée par le noeud du schéma mais cela n'avait aucun effet.
3) J'ai essayé de changer le 2ème gabarit pour ressembler à ceci: 1]/child :: "> mais je ne comprends pas pourquoi parce que> 0 fonctionne bien
4 J'ai également essayé de changer le 2ème modèle avec des variantes de match =" Row/child ::
mais ceci bousille également le format des données. Toute aide est grandement appréciée.xslt ignorer le schéma en rowset

Résultats actuels:

"Column0", "Column1", "Column2", "Column3" 
"" 
"0", "2010", "336227.46", "1.43075514893617" 
"0", "2011", "782819.36", "3.40356243478261" 
"0", "2012", "783044.89", "3.591489362" 

Source XML:

<rowset xmlns="urn:schemas-microsoft-com:xml-analysis:rowset" > 
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:saw-sql="urn:saw-sql" targetNamespace="urn:schemas-microsoft-com:xml-analysis:rowset"> 
     <xsd:complexType name="Row"> 
      <xsd:sequence> 
       <xsd:element name="Column0" type="xsd:int" minOccurs="0" maxOccurs="1" saw-sql:type="integer" saw-sql:displayFormula="s_0" /> 
       <xsd:element name="Column1" type="xsd:string" minOccurs="0" maxOccurs="1" saw-sql:type="varchar" saw-sql:displayFormula="s_1" /> 
       <xsd:element name="Column2" type="xsd:double" minOccurs="0" maxOccurs="1" saw-sql:type="double" saw-sql:displayFormula="s_2" /> 
       <xsd:element name="Column3" type="xsd:double" minOccurs="0" maxOccurs="1" saw-sql:type="double" saw-sql:displayFormula="s_3" /> 
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:schema> 
    <Row> 
     <Column0>0</Column0> 
     <Column1>2010</Column1> 
     <Column2>336227.46</Column2> 
     <Column3>1.43075514893617</Column3> 
    </Row> 
    <Row> 
     <Column0>0</Column0> 
     <Column1>2011</Column1> 
     <Column2>782819.36</Column2> 
     <Column3>3.40356243478261</Column3> 
    </Row> 
    <Row> 
     <Column0>0</Column0> 
     <Column1>2012</Column1> 
     <Column2>783044.89</Column2> 
     <Column3>3.591489362</Column3> 
    </Row> 
</rowset> 

Code de version - le plus proche

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:fn="http://www.w3.org/2005/xpath-functions" 
    xmlns:xdt="http://www.w3.org/2005/xpath-datatypes" 
    xmlns:err="http://www.w3.org/2005/xqt-errors" 
    exclude-result-prefixes="xs xdt err fn"> 

    <xsl:output method="text" indent="yes"/> 

<xsl:strip-space elements="*" /> 

<xsl:template match="/*"> 
<xsl:for-each select="*[2]/*"> 
<xsl:text>"</xsl:text> 
<xsl:value-of select="name()"/> 
<xsl:text>"</xsl:text> 
<xsl:if test="position() != last()">, </xsl:if> 
<xsl:if test="position() = last()"> 
<xsl:text>&#xD;&#xA;</xsl:text> 
</xsl:if> 
</xsl:for-each> 
<xsl:apply-templates/> 
</xsl:template> 


<xsl:template match="/*/child::*"> 
<xsl:for-each select="child::*"> 
<xsl:if test="position() != last()">"<xsl:value-of select="normalize-space(.)"/>", </xsl:if> 
<xsl:if test="position() = last()">"<xsl:value-of select="normalize-space(.)"/>"<xsl:text>&#xD;&#xA;</xsl:text> 
</xsl:if> 
</xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

Répondre

1

La ligne supplémentaire est causé par vos modèles d'application à tous les enfants de l'élément racine. Cela inclut le noeud xsd:schema.

Vous pouvez éviter cela en changeant:

<xsl:apply-templates/> 

en ligne # 23:

<xsl:apply-templates select="*[position() gt 1]"/> 

post-scriptum Je suggère que vous utilisez explicite noms pour adresser les nœuds XML source, au lieu d'abréviations cryptiques comme *[2]/*. Cela rendra votre code plus lisible et, par conséquent, plus facile à gérer.

+0

Merci, mon inclination sur * [2]/* est de le changer en Row [1]/* que j'interprète comme tous les enfants de la 1ère instance de Row mais cela ne correspond à rien. Il y a évidemment quelque chose qui me manque ... – user3120960

+0

"* Il y a évidemment quelque chose qui me manque .. *" Oui, le fait que les éléments de votre source XML se trouvent dans un * namespace *. Voir, par exemple: http://stackoverflow.com/questions/34758492/xslt-transform-doesnt-work-until-i-remove-root-node/34762628#34762628 –