2016-07-22 17 views
1

Ich wollte Platzhalter in einer XML-Steuerdatei von einer Drittanbietersoftware ersetzen.XSLT - Vergleichen Sie jeden XML-Attributwert mit einem bestimmten Attributwert.

Leider werden diese Platzhalter auch als Attributwerte in dieser XML-Datei verwendet.

Ich will Ihnen ein Beispiel geben:

<control> 
    <some-tag id="$wildcard1$" version="3.14"> 
    <another-tag id="second_level">stackoverflow rocks!</another-tag> 
    </some-tag> 
    <some-tag id="foo" version="$wildcard2$"/> 
    <some-tag id="bar" version="145.31.1"/> 
</control> 

ich eine generische Transformation mit Parametern zu schreiben versucht, die Platzhalter in den Attributwerten zu ersetzen.

Mein größtes Problem war, dass ich den Attributnamen nicht kenne. Also muss ich jedes Attribut in der XML-Datei abgleichen. Das ist einfach , aber wie ich jedes Attribut mit einem bestimmten Wert (z. B. $ Wildcard $) übereinstimmen?

Antwort

1

Die Antwort auf diese Frage war einfacher als ich dachte.

<xsl:template match="@*[. = $wildcard]"> 
    <xsl:attribute name="{name(.)}"> 
     <xsl:value-of select="$wildcard_value"/> 
    </xsl:attribute> 
</xsl:template> 

Ich hoffe, es hilft jemandem.

PS: Hier ist meine volle XSL-Transformation zu Platzhalter in Attributen Werte zu ersetzen:

<?xml version="1.0" encoding="UTF-8"?> 
<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"> 
    <xsl:param name="wildcard" required="yes" /> 
    <xsl:param name="wildcard_value" required="yes" /> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" 
     indent="yes" /> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="@*[. = $wildcard]"> 
     <xsl:attribute name="{name(.)}"> 
      <xsl:value-of select="$wildcard_value" /> 
     </xsl:attribute> 
    </xsl:template> 
</xsl:stylesheet> 
+2

Beachten Sie, dass 'match = "[. = $ Wildacard] */@ *"' kann 'Spiel verkürzt werden = "@ * [. = $ wildacard]" '. Und wenn Sie wirklich XSLT Version 3.0 verwenden, können Sie anstelle der ersten Vorlage einfach '' deklarieren. Ich stelle auch fest, dass Ihr deklarierter Paramname 'name =" Wildcard "' ist, Ihr Code jedoch auf $ wildacard verweist. –

+0

funktioniert nur mit der Enterprise-Version von saxon. Also entschied ich mich, das Stylesheet als Version 2.0 zu kennzeichnen – commandcraxx

Verwandte Themen