2016-09-22 2 views
0

Ich habe folgende xml:XSLT Elternteil auf aktuellen Knotennamen wählen basierend

<field_x_position> 
    <en is_array="true"> 
    <value>60</value> 
    </en> 
    <de is_array="true"> 
    <value>70</value> 
    </de> 
</field_x_position> 

<field_background_image> 
    <de is_array="true"> 
    <filename>filename_de.png</filename> 
    </de> 
    <en is_array="true"> 
    <filename>filenmae_en.png</filename> 
    </en> 
</field_background_image> 

Ich versuche es erneut schreiben ein folgendes Ergebnis

<backgroundImgage> 
    <en x="60">filename_en.png</en> 
    <de x="70">filename_de.png</de> 
</backgroundImage> 

bekommen Da es mehr Sprachen hinzugefügt werden könnten I müssen diese durchlaufen. Wie kann ich den passenden Wert des entsprechenden Elements auswählen, da der Name (.) In einem XPath-Ausdruck natürlich nicht funktioniert.

<xsl:element name="bgImage"> 
    <xsl:for-each select="field_background_image/*"> 
    <xsl:element name="{name(.)}"> 
     <xsl:attribute name="x"> 
     <xsl:value-of select="../../field_x_position/name(.)/item/value"/> 
     </xsl:attribute> 
     <xsl:value-of select="item/filename"/> 
    </xsl:element> 
</xsl:for-each> 

Vielen Dank für Ihre Hilfe.

Antwort

1

Der Ausdruck Sie suchen, dann ist dies (Beachten Sie, dass es keine in Ihrem XML-item Element ist, so habe ich das auch aus dem Ausdruck entfernt)

<xsl:value-of select="../../field_x_position/*[name() = current()/name()]/value"/> 

Alternativ Verwendung einer variablen machen zu leicht zu vereinfachen es. Versuchen Sie, diese XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="xml" indent="yes" /> 

    <xsl:template match="/*"> 
     <xsl:element name="bgImage"> 
      <xsl:for-each select="field_background_image/*"> 
       <xsl:variable name="name" select="name()" /> 
       <xsl:element name="{$name}"> 
        <xsl:attribute name="x"> 
         <xsl:value-of select="../../field_x_position/*[name() = $name]/value"/> 
        </xsl:attribute> 
        <xsl:value-of select="filename"/> 
       </xsl:element> 
      </xsl:for-each> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Vielen Dank! Funktioniert perfekt. –

0

Ich würde vorschlagen, XSLT's built-in key Mechanismus für die Lösung Querverweise:

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:key name="x" match="field_x_position/*" use="name()" /> 

<xsl:template match="/*"> 
    <backgroundImage> 
     <xsl:for-each select="field_background_image/*"> 
      <xsl:element name="{name()}"> 
       <xsl:attribute name="x"> 
        <xsl:value-of select="key('x', name())/value"/> 
       </xsl:attribute> 
       <xsl:value-of select="filename"/> 
      </xsl:element> 
     </xsl:for-each> 
    </backgroundImage> 
</xsl:template> 

</xsl:stylesheet> 
Verwandte Themen