2012-05-03 9 views
6

Ich versuche etwas zu tun, das scheint, wie es sehr einfach sein sollte, aber ich kann es nicht funktionieren, und ich kann nicht scheinen, irgendwelche Beispiele zu finden involviere nicht viele irrelevante Dinge. Ich möchte den Textinhalt eines bestimmten XML-Tags auf einen bestimmten Wert aktualisieren (der als Parameter übergeben wird. Diese XSLT wird von ant verwendet). Ein einfaches Beispiel:Aktualisieren Sie den Text eines Elements mit XSLT basierend auf Param

Ich möchte

<foo> 
    <bar> 
    baz 
    </bar> 
</foo> 

Um

<foo> 
    <bar> 
     something different 
    </bar> 
</foo> 

Dies ist das Stylesheet-Transformation ist, dass ich versucht, die die Tags in nur Ergebnisse, kein Text an allen

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <!-- identity transformation, to keep everything unchanged except for the stuff we want to change --> 
    <!-- Whenever you match any node or any attribute --> 
    <xsl:template match="node()|@*"> 
     <!-- Copy the current node --> 
     <xsl:copy> 
      <!-- Including any attributes it has and any child nodes --> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <!-- change the text of the bar node, in the real template the value won't be specified inline --> 
    <xsl:template match="/foo/bar/"> 
     <xsl:param name="baz" value="something different"/> 
      <xsl:value-of select="$baz"/> 
    </xsl:template> 
</xsl:stylesheet> 

Vielen Dank im Voraus!

Antwort

10

Es gibt eine Reihe von Problemen mit dem bereitgestellten Code, den Fehler führen zu kompilieren Zeit:

<xsl:template match="/foo/bar/"> 
    <xsl:param name="baz" value="something different"/> 
     <xsl:value-of select="$baz"/> 
</xsl:template> 
  1. Das Spiel Muster auf dieser Vorlage angegeben syntaktisch ist illegal - Ein XPath-Ausdruck kann nicht mit dem Zeichen / enden.

  2. xsl:param kann nicht ein unbekanntes Attribut wie value haben

Lösung:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:param name="pReplacement" select="'Something Different'"/> 

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

<xsl:template match="foo/bar/text()"> 
    <xsl:value-of select="$pReplacement"/> 
</xsl:template> 
</xsl:stylesheet> 

Wenn diese Transformation auf der mitgelieferten XML-Dokument angewendet wird:

<foo> 
    <bar> 
    baz 
    </bar> 
</foo> 

das gewünschte, korrekte Ergebnis wird produziert:

<foo> 
    <bar>Something Different</bar> 
</foo> 
0
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
<xsl:output indent="yes" encoding="UTF-8" method="xml"/> 
<xsl:param name="param-from-ant" as="xs:string"/> 

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

<xsl:template match="/foo/bar"> 
<xsl:value-of select="$param-from-ant"/> 
</xsl:template> 
</xsl:stylesheet> 
+0

Ich habe versucht, dass (beide in meinem etwas komplexeres Beispiel, und auf [ das Basisbeispiel] (http://www.xsltcake.com/slices/Y8fojh/4)), aber scheint nicht zu funktionieren? Ich bekomme ein leeres Foo-Tag. Habe ich etwas falsch gemacht? – user1126518

+0

Sean, verursacht der zur Verfügung gestellte "XSLT-Code" Kompilierzeit Fehler mit jedem kompatiblen XSLT 1.0-Prozessor. –

0

ein etwas anderer Ansatz:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:param name="replace"/> 

    <xsl:template match="node()|@*"> 
    <xsl:choose> 
     <xsl:when test="text() and name(..)='bar' and name(../..)='foo'"> 
     <xsl:value-of select="$replace"/> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:template> 

Verwandte Themen