# Ersetzung bei XSL Transformation



## xhi2018 (23. Jul 2009)

Hallo,

ich habe eine XML-Datei mit XSL zu erzeugen, hänge dabei aber leider an einer Stelle fest und komme nicht weiter. Allzuviel Ahnung von XSL Transformation :bahnhof: hab ich leider auch nicht und deshalb hier die Frage ob mir vielleicht jemand von Euch einen Tipp geben könnte. 
Hier beispielhaft meine Input Datei:
[XML]<?xml version="1.0" encoding="ISO-8859-1"?>
<foo>
   <bar>
      <name>abc</name>
      <version>1.00-00</version>
   </bar>
   <bar>
      <name>def</name>
      <version>1.01-00</version>
   </bar>
   <bar>
      <name>ghi</name>
      <version>1.02-00</version>
   </bar>
....
</foo>[/XML]
Hier die XSL Datei
[XML]<?xml version="1.0" ?>
<xsl:stylesheet version="1.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xslutput method="html" indent="yes" />
   <xsl:template match="/">
      <xsl:variable name="lower">abcdefghijklmnopqrstuvwxyz</xsl:variable>
      <xsl:variable name="upper">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable>
      <xsl:element name="element">
         <xsl:attribute name="version">2.0</xsl:attribute>
         <xsl:element name="test">
            <xsl:attribute name="id"><xsl:text>id-text</xsl:text></xsl:attribute>
            <xsl:for-each select="foo/bar">
               <xsl:element name="prj">
                  <xsl:variable name="barname" select="name" />
                  <xsl:attribute name="refid">irgendeintext/<xsl:value-of select="name" />/<xsl:value-of
                     select="translate($barname,$lower,$upper)" />/<xsl:value-of
                     select="version" />,<xsl:value-of
                     select="name" /></xsl:attribute>
               </xsl:element>
            </xsl:for-each>
         </xsl:element>
      </xsl:element>
   </xsl:template>
</xsl:stylesheet>[/XML] Erzeugt damit diesen XML-Output.[XML]<element version="2.0">
<test id="id-text">
<prj refid="irgendeintext/abc/ABC/1.00-00,abc"></prj>
<prj refid="irgendeintext/def/DEF/1.01-00,def"></prj>
<prj refid="irgendeintext/ghi/GHI/1.02-00,ghi"></prj>
<prj refid="irgendeintext/jkl/JKL/1.20-00,jkl"></prj>
<prj refid="irgendeintext/mno/MNO/10.00-00,mno"></prj>
</test>
</element>[/XML] Mein Problem ist die Version. Der* Punkt "." *und der* Bindestrich "-" *in der Version müssten in einen* Unterstrich "_" *geändert werden. Also so:[XML]<element version="2.0">
<test id="id-text">
<prj refid="irgendeintext/abc/ABC/1_00_00,abc"></prj>
<prj refid="irgendeintext/def/DEF/1_01_00,def"></prj>
<prj refid="irgendeintext/ghi/GHI/1_02_00,ghi"></prj>
<prj refid="irgendeintext/jkl/JKL/1_20_00,jkl"></prj>
<prj refid="irgendeintext/mno/MNO/10_00_00,mno"></prj>
</test>
</element>[/XML]Aber leider hab ich keine :bahnhof: wie ich da rangehen könnte.

Bin für jeden Tipp sehr dankbar


----------



## SlaterB (23. Jul 2009)

na wieder translate benutzen, wie bei lower/ upper:

select="translate(version,".-","__")"


----------



## xhi2018 (24. Jul 2009)

Hallo,



SlaterB hat gesagt.:


> na wieder translate benutzen, wie bei lower/ upper:
> select="translate(version,".-","__")"


 ja mei - wie einfach...  und mit den richtigen * - ' - * Anführungszeichen geht's dann wie gewünscht:
[XML]<?xml version="1.0" ?>
<xsl:stylesheet version="1.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xslutput method="html" indent="yes" />
   <xsl:template match="/">
      <xsl:variable name="lower">abcdefghijklmnopqrstuvwxyz</xsl:variable>
      <xsl:variable name="upper">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable>
      <xsl:element name="element">
         <xsl:attribute name="version">2.0</xsl:attribute>
         <xsl:element name="test">
            <xsl:attribute name="id"><xsl:text>id-text</xsl:text></xsl:attribute>
            <xsl:for-each select="foo/bar">
               <xsl:element name="prj">
                  <xsl:variable name="barname" select="name" />
                  <xsl:attribute name="refid">irgendeintext/<xsl:value-of select="name" />/<xsl:value-of
                     select="translate($barname,$lower,$upper)" />/<xsl:value-of select="translate(version,'.-','__')"/>,<xsl:value-of
                     select="name" /></xsl:attribute>
               </xsl:element>
            </xsl:for-each>
         </xsl:element>
      </xsl:element>
   </xsl:template>
</xsl:stylesheet>[/XML]super - bin glücklich & vielen Dank :applaus:


----------

