Announcement

Collapse
No announcement yet.

Sonderzeichen umwandeln

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Sonderzeichen umwandeln

    Hallo,
    ich habe folgendes XML:
    Code:
    <ROW>
      <SNR>&apos;0044511018</SNR>
      <TYPE>T</TYPE>
     </ROW>
     <ROW>
      <SNR>&apos;0044511019</SNR>
      <TYPE>F</TYPE>
     </ROW>
    und möchte es per XSLT in ein CSV umwandeln. Dafür habe ich folgendes verwendet:
    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" encoding="ISO-8859-1"/>
    [...]
    <xsl:template match="ROW">
        <xsl:for-each select="*">
            <xsl:value-of select="."/>;
        </xsl:for-each>
    [...]
    Heraus kommt folgendes;
    &apos;0044511018;T
    &apos;0044511019;F


    Ich möchte aber dass das &apos; umgewandelt wird in ' und als ergebnis rauskommt:
    '0044511018;T
    '0044511019;F

    Hintergrund ist, dass Excel beim Öffnen der CSV Dateien die führenden Nullen rausschmeisst und als Zahl interpretiert.

    Vielen Dank im Voraus.

    Alfonso

  • #2
    Hallo Alfonso,
    das ist jetzt grad nur so ein fixer Gedanke, aber evtl. funktioniert es ja (habs jetzt nicht getestet).
    Meine Idee ist mit einem substring() die ersten 6 Zeichen ("&apos;") wegschneiden, und dann mit einem concat("'",$rest) dem restlichen Teil ein ' voranstellen...

    Comment


    • #3
      Originally posted by nanuschi View Post
      Meine Idee ist mit einem substring() die ersten 6 Zeichen ("&apos;") wegschneiden, und dann mit einem concat("'",$rest) dem restlichen Teil ein ' voranstellen...
      Danke für deinen Tipp, aber das klappt nicht, da ich nicht bei jedem Eintrag ein &apos; habe. Der Tag <SNR> hat es, der Tag <TYPE> nicht.

      Comment


      • #4
        Originally posted by Alfonso View Post
        Danke für deinen Tipp, aber das klappt nicht, da ich nicht bei jedem Eintrag ein &apos; habe. Der Tag <SNR> hat es, der Tag <TYPE> nicht.
        Du könntest dann nur über die <SNR>-Tags iterieren...
        Code:
        <xsl:template match="ROW">
            <xsl:for-each select="*">
                 <xsl:if test="*=SNR">
                   <xsl:variable name="rest"><xsl:value-of select="substring(.,0,6)" /></xsl:variable>
                   <xsl:value-of select="concat("'",$rest) />
                 </xsl:if>
                 <xsl:value-of select="."/>
            </xsl:for-each>
        So etwas in der Richtung könnte klappen (muss dazu sagen dass das hier nicht die ultimative Lösung ist, bin noch recht neu was XSL betrifft!)

        Comment


        • #5
          Irgendwie bin ich so nicht ganz glücklich mit der Lösung.
          Ich dachte eher an etwas mit Replace. Dieses hätte den Charm, dass das Aposthroph theoretisch überall stehen könnte.
          Wie mache ich es mit replace?

          Alfonso

          Comment


          • #6
            Die replace-Funktion funktioniert evtl auch
            Code:
            <xsl:value-of select="replace(.,'&apos;',''')"/>
            Aber wenn du nicht genau weisst, wo das Aposthroph liegt, musst du zwangsläufig erstmal alle Elemente prüfen, ob überhaupt einer enthalten ist...
            Code:
            <xsl:if test="contains(.,'&apos')">
            Wäre dann eine Richtung, die man gehen könnte...
            Zuletzt editiert von Gast_1; 05.11.2009, 11:03. Reason: contains-Fkt zugefügt

            Comment


            • #7
              Mit welchem Prozessor arbeitest Du? Ich erhalte mit Saxon 9.2 HE und AltovaXML 2010, aber auch mit MSXML, problemlos das gesuchte Ergebnis:

              '0044511018;T;
              '0044511019;F;

              mit

              Code:
              <xsl:template match="ROW">
                <xsl:for-each select="*"><xsl:value-of select="."/>;</xsl:for-each>
                <xsl:text>&#xA;</xsl:text>
              </xsl:template>
              Vielleicht hilft im konkreten Prozessor-Fall die Angabe von disable-output-escaping="yes" bei xsl:value-of.

              Comment

              Working...
              X