2017-12-13 5 views
0

Wir haben das folgende XML, dass wir den Weg in src-Attribut ParameterXSLT-Transformation Halte nicht die Attribute

<?xml version="1.0"?> 
<ul> 
<font> test sample font test </font> 
<img src="/assets/rep/myimage.png"> test</img> 
<img src="/assets/rep/myimage.png" height="20px"> test</img> 
</ul> 

Mein XSLT ist finden und ersetzen müssen als

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <!-- remove disallowed elements but keep its children --> 
    <xsl:template match="font"> 
     <xsl:apply-templates></xsl:apply-templates> 
    </xsl:template> 

    <xsl:template match="@src"> 
     <xsl:variable name="imagesrc" select="replace(.,'/assets/rep/','/images/')"/>  
     <img src="{$imagesrc}" /> 
    </xsl:template> 
</xsl:stylesheet> 

Die XSLT-Wiedergabe funktioniert folgendermaßen für

<img src="/assets/rep/myimage.png"> test</img> 

aber nicht für

<img src="/assets/rep/myimage.png" height="20px"> test</img> 

Ich habe versucht, match = "@ src [parent :: img]" hinzuzufügen, aber das funktioniert auch nicht. Können Sie mir mitteilen, was ich in meinem XSLT vermisse, um die Attribute beizubehalten und nur "src" -Attribute zu modifizieren?

+0

Ist Ihr XSLT vollständig? Sie haben keine Vorlage, die "img" entspricht, und als Konsequenz werden die integrierten Vorlagen für diesen Knoten verwendet, der die untergeordneten Knoten, aber keine Attribute auswählt (und so würde Ihre Vorlage mit "@ src" übereinstimmen) nicht benutzt werden). –

+0

Erhalten Sie einen Fehler? Oder einfach nicht das erwartete Ergebnis? –

Antwort

2

Ihre aktuelle Logik ändern zu Vorlagen wie folgt aus:

... 
<xsl:template match="img"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="img/@src"> 
    <xsl:attribute name="src"> 
     <xsl:value-of select="replace(.,'/assets/rep/','/images/')"/> 
    </xsl:attribute> 
</xsl:template> 
... 

In Ihrem Versuch, erstellt ein Element <img>, während kontext Knoten ein Attribut ist @src . Mit dem mitgelieferten Beispiel geht es Ihnen gut!

+0

Das obige funktionierte. Vielen Dank. Ich fügte auch eine case insensitive Nachschlagen mit "i" -Flag hinzu. – Shiva

1

Try this:

<xsl:template match="@src"> 
    <xsl:attribute name="src"> 
     <xsl:value-of select="replace(.,'/assets/rep/','/images/')"/> 
    </xsl:attribute> 
</xsl:template>