Announcement

Collapse
No announcement yet.

1.template einmal durchlaufen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • 1.template einmal durchlaufen

    Hallo erstmal,
    ich habe einen Ordner voller XML Dateien die alle über ein XSLT Script zu einer CSV Datei transformiert werden sollen.
    In der CSV soll es einen header (Kunde;Artikel;...) geben und darunter pro XML eine Zeile ;-separierte Werte.

    Meine XML:
    Code:
    <xsl:template match="/">
    		<xsl:text>  </xsl:text><xsl:for-each select="//axis2ns14:Lieferung['first']"><xsl:call-template name="head"/></xsl:for-each>
    	<xsl:apply-templates select="//Lieferung"/>
    </xsl:template>
    
    <xsl:template match="//Lieferung">
              <xsl:for-each select=".//*[count(*)=0]"><xsl:call-template name="Liefer"/>
    	</xsl:for-each><xsl:text>
    </xsl:text>
    </xsl:template>
    
    <xsl:template name="head">
    <xsl:choose>
      <xsl:when test="name()">
        <xsl:for-each select=".//*[count(*)=0]"><xsl:value-of select="substring-after(name(),':')"/><xsl:text>;</xsl:text></xsl:for-each><xsl:text>
    </xsl:text></xsl:when>
      <xsl:otherwise>
        <xsl:text>;;</xsl:text>
      </xsl:otherwise>
    </xsl:choose>
    </xsl:template>
    
    <xsl:template name="Liefer">
      <xsl:if test="name()='Bank'">
        <xsl:text>;</xsl:text>
      </xsl:if>
      <xsl:value-of select="normalize-space(.)"/><xsl:text>;</xsl:text>
    </xsl:template>
    Die Daten werden alle geholt und auch fast richtig in die CSV geschrieben,
    allerdings wird head immer wieder geschrieben...
    Code:
    kunde;artikel;preis;datum;
    kunde;artikel;preis;datum;
    klaus;hose;15,00;24.02.2009;
    michael;jeans;19,99;25.02.2009;
    usw
    Kann mir jemand einen Anstoß geben, wie ich head nur einmal durchlaufen lasse?

    LG
    Akina
    Zuletzt editiert von Akina; 26.02.2009, 15:01.

  • #2
    Okay, hab's jetzt auch allein gelöst...

    Hier die Lösung:
    Code:
    <xsl:template match="/">
    	<xsl:text>  </xsl:text><xsl:for-each select="//axis2ns14:Lieferung[position()=1]"><xsl:call-template name="head"/></xsl:for-each>
    	<xsl:apply-templates select="//axis2ns14:Lieferung"/>
    </xsl:template>
    
    <xsl:template match="//axis2ns14:Lieferung">
              <xsl:for-each select=".//*[count(*)=0]"><xsl:call-template name="Lieferungskind"/>
    	</xsl:for-each><xsl:text>
    </xsl:text>
    </xsl:template>
    
    <xsl:template name="head">
        <xsl:for-each select=".//*[count(*)=0]">
        	<xsl:choose>
        		<xsl:when test="name()='axis2ns14:Bankverbindung'">
        			<xsl:text>BLZ;Kontonummer;</xsl:text>
        		</xsl:when>
        		<xsl:otherwise>
        			<xsl:value-of select="substring-after(name(),':')"/><xsl:text>;</xsl:text>
        		</xsl:otherwise>
        	</xsl:choose>
        </xsl:for-each><xsl:text>
    </xsl:text>
    </xsl:template>
    
    <xsl:template name="Lieferungskind">
      <xsl:if test="name()='axis2ns14:Bankverbindung'">
        <xsl:text>;</xsl:text>
      </xsl:if>
      <xsl:value-of select="normalize-space(.)"/><xsl:text>;</xsl:text>
    </xsl:template>

    Comment

    Working...
    X