2016-05-16 19 views
0

Ich habe ein Stylesheet mit der folgenden Vorlage:XSLT-Vorlage nicht produzieren Elementnamen korrekt

<xsl:template match="row/*"> 
    <xsl:for-each select="."> 
     <saxon:assign name="count"><xsl:value-of select="$count+1" /></saxon:assign> 
     <xsl:variable name="node-value" as="xs:string" select="." /> 
     <xsl:variable name="node-name" as="xs:string"><xsl:value-of select="preceding::fielddescription/name(*[$count])" /></xsl:variable> 
     <xsl:variable name="current-node" as="xs:string"><xsl:value-of select="preceding::fielddescription/.[$count]" /></xsl:variable> 
     <xsl:if test=".[not(self::F2 or self::F7)]"> 
      <xsl:element name="{$current-node}"> 
       <xsl:value-of select="normalize-space(.)" /> 
      </xsl:element> 
     </xsl:if> 
     <xsl:if test=".[self::F2]"> 
      <UPCs> 
       <xsl:element name="{$current-node}"><xsl:value-of select="normalize-space(.)" /></xsl:element> 
      </UPCs> 
     </xsl:if> 
     <xsl:if test=".[self::F7]"> 
      <xsl:element name="{$current-node}"> 
       <xsl:value-of select="lower-case(normalize-space(replace(., '[/ ]', '-')))" /> 
      </xsl:element> 
     </xsl:if> 
    </xsl:for-each> 
</xsl:template> 

Was ich tun möchte, ist Prozess jedes Element innerhalb eines nodeset wie folgt gegeben:

<fielddescription> 
    <F1>ExternalId</F1> 
    <F2>UPC</F2> 
    <F3>Name</F3> 
    <F4>Description</F4> 
    <F5>ProductPageUrl</F5> 
    <F6>ImageUrl</F6> 
    <F7>CategoryExternalId</F7> 
</fielddescription> 

und produzieren neue Elemente mit Tag-Namen, die den Werten jedes Elements in <fielddescription> für jede das Stylesheet entspricht. Bisher funktionieren alle meine Stylesheets mit Ausnahme dieser Vorlage. es hält Knoten mit Tags erzeugen, die die gesamte Sequenz Namen sind:

<Product removed="false"> 
    <ExternalIdUPCNameDescriptionProductPageUrlImageUrlCategoryExternalId>ED003-QCX</ExternalIdUPCNameDescriptionProductPageUrlImageUrlCategoryExternalId> 
    <UPCs> 
    <ExternalIdUPCNameDescriptionProductPageUrlImageUrlCategoryExternalId>031878025147</ExternalIdUPCNameDescriptionProductPageUrlImageUrlCategoryExternalId> 
    </UPCs> 
    <ExternalIdUPCNameDescriptionProductPageUrlImageUrlCategoryExternalId>Sealy Naturals-Cotton Crib Mattress Pad</ExternalIdUPCNameDescriptionProductPageUrlImageUrlCategoryExternalId> 
    <ExternalIdUPCNameDescriptionProductPageUrlImageUrlCategoryExternalId>Give baby plush comfort from natural cotton fibers with the innovative Sealy Naturals-Cotton Crib Mattress Pad.</ExternalIdUPCNameDescriptionProductPageUrlImageUrlCategoryExternalId> 
    <ExternalIdUPCNameDescriptionProductPageUrlImageUrlCategoryExternalId>http://www.kolcraft.com/sealy-naturals-cotton-crib-mattress-pad.html</ExternalIdUPCNameDescriptionProductPageUrlImageUrlCategoryExternalId> 
    <ExternalIdUPCNameDescriptionProductPageUrlImageUrlCategoryExternalId>http://www.kolcraft.com/media/catalog/product/e/d/ed003-qcx-1_1_4.jpg</ExternalIdUPCNameDescriptionProductPageUrlImageUrlCategoryExternalId> 
    <ExternalIdUPCNameDescriptionProductPageUrlImageUrlCategoryExternalId>bedding-pads</ExternalIdUPCNameDescriptionProductPageUrlImageUrlCategoryExternalId> 
    <Attributes> 
    <Attribute id="BV_FE_FAMILY"> 
     <Value>ED003</Value> 
    </Attribute> 
    <Attribute id="BV_FE_EXPAND"> 
     <Value>BV_FE_FAMILY:ED003</Value> 
    </Attribute> 
    </Attributes> 
</Product> 

Was falsch meine Vorlage tut? Ich sollte auch beachten, dass ich die <saxon:assign> Funktion verwendet habe, weil ich nicht wusste, wie sonst das Stylesheet mit einer Variablen arbeiten würde, die aktualisiert werden würde ... Ich weiß, es gibt wahrscheinlich einen besseren Weg, dies mit Rekursion zu tun, aber ich konnte nicht Finde keinen Weg, um es zum Laufen zu bringen. Kann jemand helfen?

+0

Die Variable 'current-node' wird am Anfang der Vorlage als untergeordnetes Element der Gruppe' for-each' definiert: ' ' –

Antwort

0

Verwenden Sie einfach

<xsl:template match="row/F2"> 
    <xsl:variable name="pos" as="xs:integer"><xsl:number count="*"/></xsl:variable> 
    <xsl:variable name="node-name" as="xs:string" select="name(preceding::fielddescription/*[$pos])"/> 
      <UPCs> 
       <xsl:element name="{$node-name}"><xsl:value-of select="normalize-space(.)" /></xsl:element> 
      </UPCs> 
</xsl:template> 

<xsl:template match="row/F7"> 
    <xsl:variable name="pos" as="xs:integer"><xsl:number count="*"/></xsl:variable> 
    <xsl:variable name="node-name" as="xs:string" select="name(preceding::fielddescription/*[$pos])"/> 
      <xsl:element name="{$node-name}"> 
       <xsl:value-of select="lower-case(normalize-space(replace(., '[/ ]', '-')))" /> 
      </xsl:element> 
</xsl:template> 

<xsl:template match="row/*[not(self::F2 or self::F7)]"> 
    <xsl:variable name="pos" as="xs:integer"><xsl:number count="*"/></xsl:variable> 
    <xsl:variable name="node-name" as="xs:string" select="name(preceding::fielddescription/*[$pos])"/> 

      <xsl:element name="{$node-name}"> 
       <xsl:value-of select="normalize-space(.)" /> 
      </xsl:element> 


</xsl:template> 

Je nachdem, wo und wie Sie verwenden apply-templates in Vorfahrenelement-Vorlagen Sie die <xsl:variable name="pos" as="xs:integer"><xsl:number count="*"/></xsl:variable> mit <xsl:variable name="pos" select="position()"/> ersetzen könnte können. Aber wir müssten den Rest des Codes sehen, um es zu erzählen.

+0

Ihr Fix hat funktioniert. :) Vielen Dank! Ich hatte auch eine andere Lösung für mein Problem gefunden, ich benutzte die 'name()' der '' Knoten und nicht die 'text()' dieser Knoten. –