Xirpy: XML-Formatierung - Zeilenumbruch im String

Hallo Selfhtml-Community :)

ich habe eine Frage bezüglich der XML-Formatierung mittels XSL.
Hierbei soll z.B. folgendes XML-Dokument umgestaltet werden:

  
<?xml version="1.0" encoding="utf-8"?>  
<data>  
   <element attribute1="[#content1, #content2]" attribute2="[#content3, #content4]"/>  
</data>  

Mit der folgenden XSL-Datei:

  
<?xml version="1.0" encoding="iso-8859-1"?>  
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
    <xsl:key name="content1-only" match="element" use="@attribute1"/>  
    <xsl:template match="data">  
        <xsl:text>&#10;</xsl:text>  
        <data>  
            <xsl:apply-templates>  
            </xsl:apply-templates>  
        </data>  
    </xsl:template>  
    <xsl:template match="element">  
        <xsl:text disable-output-escaping="yes">&#9;&lt;element</xsl:text>  
        <xsl:text>&#10;</xsl:text>  
        <xsl:text>&#9;&#9;attribute1="</xsl:text>  
        <xsl:value-of select="@attribute1" />  
        <xsl:text>"&#10;</xsl:text>  
        <xsl:text>&#9;&#9;attribute2="</xsl:text>  
        <xsl:value-of select="@attribute2" />  
        <xsl:text>"&#10;</xsl:text>  
        <xsl:text disable-output-escaping="yes">&#9;/&gt;</xsl:text>  
    </xsl:template>  
</xsl:stylesheet>  

...habe ich schon folgende Formatierung verwirklicht:

  
<?xml version="1.0" encoding="utf-8"?>  
<data>  
   <element  
	attribute1="[#content1, #content2]"  
	attribute2="[#content3, #content4]"  
   />  
</data>  

Jetzt zur eigentlichen Fragen...
Was muss ich tun, damit auch der Inhalt der Attribute mit Zeilenumbrüchen versehen wird? Also das das Ganze in folgende Form kommt:

  
<?xml version="1.0" encoding="utf-8"?>  
<data>  
   <element  
	attribute1="[  
            #content1,  
            #content2]"  
	attribute2="[  
            #content3,  
            #content4]"  
   />  
</data>  

Vielen Dank im Vorraus.

  1. Hallo Xirpy,

    Hierbei soll z.B. folgendes XML-Dokument umgestaltet werden:

    Das ist schon sehr abenteuerlich. Ggf. baut das ein später auf den Code angewendeter XML-Editor wieder um. Ich würde indent="yes" bei xsl:output setzen, was aus meiner Sicht ausreichend sinnvoll einrückt.

    Was muss ich tun, damit auch der Inhalt der Attribute mit Zeilenumbrüchen versehen wird?

    substring-before(@attribute1, ' ') und substring-after(@attribute1, ' ') usw.

    Grüße,
    Thomas

    1. Besten Dank, Thomas für deine schnelle Antwort!

      Mit substring hat das Ganze schon super geklappt. Hier der XSL-Code:

        
      <?xml version="1.0" encoding="iso-8859-1"?>  
      <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
          <xsl:key name="content1-only" match="element" use="@attribute1"/>  
          <xsl:template match="data">  
              <xsl:text>&#10;</xsl:text>  
              <data>  
                  <xsl:apply-templates>  
                  </xsl:apply-templates>  
              </data>  
          </xsl:template>  
          <xsl:template match="element">  
              <xsl:text disable-output-escaping="yes">&#9;&lt;element</xsl:text>  
              <xsl:text>&#10;</xsl:text>  
              <xsl:text>&#9;&#9;attribute1="[</xsl:text>  
              <xsl:text>&#10;&#9;&#9;&#9;</xsl:text>  
              <xsl:value-of select="substring-after(substring-before(@attribute1,','),'[')"/>  
              <xsl:text>,&#10;&#9;&#9;   </xsl:text>  
              <xsl:value-of select="substring-before(substring-after(@attribute1,','),']')"/>  
              <xsl:text>&#10;&#9;&#9;]"&#10;</xsl:text>  
              <xsl:text>&#9;&#9;attribute2="[</xsl:text>  
              <xsl:text>&#10;&#9;&#9;&#9;</xsl:text>  
              <xsl:value-of select="substring-after(substring-before(@attribute2,','),'[')"/>  
              <xsl:text>,&#10;&#9;&#9;   </xsl:text>  
              <xsl:value-of select="substring-before(substring-after(@attribute2,','),']')"/>  
              <xsl:text>&#10;&#9;&#9;]"&#10;</xsl:text>  
              <xsl:text disable-output-escaping="yes">&#9;/&gt;</xsl:text>  
          </xsl:template>  
      </xsl:stylesheet>  
      
      

      Das ergibt folgenden XML-Output:

        
      <?xml version="1.0" encoding="utf-8"?>  
      <data>  
         	<element  
      		attribute1="[  
      		    #content1,  
      		    #content2  
      		]"  
      		attribute2="[  
      		    #content3,  
      		    #content4  
      		]"  
      	/>  
      </data>  
      
      

      Wie kann ich das Ganze aber gestalten, wenn die Anzahl der Inhalte variiert? Zum Beispiel:

        
      <element attribute1="[#content1, #content2, #content3, #content4]"  
      
      

      Kann man vorher den Inhalt auslesen und so die Anzahl ermitteln? Und damit die Formatierung an die Gegebenheiten anpassen?

      1. Hallo Xirpy,

        Wie kann ich das Ganze aber gestalten, wenn die Anzahl der Inhalte variiert? Zum Beispiel:

        <element attribute1="[#content1, #content2, #content3, #content4]"

        
        > Kann man vorher den Inhalt auslesen und so die Anzahl ermitteln? Und damit die Formatierung an die Gegebenheiten anpassen?  
          
        Der Klassiker: Benanntes Template schreiben und dann via xsl:call-template rekursiv aufrufen. Nervenschonender ist die Nutzung von XSLT 2.0 und der XPath-Funktion [tokenize(…)](http://www.w3.org/TR/xpath-functions/#func-tokenize).  
          
        Grüße,  
        Thomas
        
        1. Heho Thomas,
          besten Dank für deine Hilfe! Ich habe meine Aufgabe lösen können.
          Hier mal der XSL-Code:

            
          <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
              <xsl:key name="content1-only" match="element" use="@attribute1"/>  
              <xsl:template name="MyFunc">  
                  <xsl:param name="string"/>  
                  <xsl:variable name="length" select="string-length($string)"/>  
                  <xsl:choose>  
                      <xsl:when test="contains($string,'#')">  
                          <xsl:value-of select="substring-before($string,'#')"/>  
                          <xsl:copy-of select="' '"/>  
                          <xsl:text>&#10;&#9;&#9;&#9;#</xsl:text>  
                          <xsl:call-template name="MyFunc">  
                              <xsl:with-param name="string"  
                                              select="substring-after($string,'#')"/>  
                              <xsl:with-param name="from" select="'#'"/>  
                              <xsl:with-param name="to" select="' '" />  
                          </xsl:call-template>  
                      </xsl:when>  
                      <xsl:otherwise>  
                          <xsl:choose>  
                              <xsl:when test="$length=2">  
                                  <xsl:text>[]"</xsl:text>  
                              </xsl:when>  
                              <xsl:otherwise>  
                                  <xsl:value-of select="substring-before($string,']')" />  
                                  <xsl:text>&#10;&#9;&#9;&#9;]"</xsl:text>  
                              </xsl:otherwise>  
                          </xsl:choose>  
                      </xsl:otherwise>  
                  </xsl:choose>  
              </xsl:template>  
            
              <xsl:template match="data">  
                  <xsl:text>&#10;</xsl:text>  
                  <data>  
                      <xsl:apply-templates>  
                      </xsl:apply-templates>  
                  </data>  
              </xsl:template>  
            
              <xsl:template match="element">  
                  <xsl:text disable-output-escaping="yes">&#9;&lt;element</xsl:text>  
                  <xsl:text>&#10;&#9;&#9;attribute1 = "</xsl:text>  
                  <xsl:call-template name="MyFunc">  
                      <xsl:with-param name="string" select="@attribute1"/>  
                  </xsl:call-template>  
                  <xsl:text>&#10;&#9;&#9;attribute2 = "</xsl:text>  
                  <xsl:call-template name="MyFunc">  
                      <xsl:with-param name="string" select="@attribute2"/>  
                  </xsl:call-template>  
                  <xsl:text disable-output-escaping="yes">/&gt;</xsl:text>  
              </xsl:template>  
            
          </xsl:stylesheet>  
          
          

          Wenn noch jemanden Verbesserungsvorschläge zur Optimierung des Codes hat, bin ich für jeden Tipp dankbar :)