Announcement

Collapse
No announcement yet.

Newline <br /> entfernen

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

  • Newline <br /> entfernen

    Hallo,

    gibt es eine Möglichkeit in XML 1.0 einfach die <br />-Elemente zu entfernen?

    Beispiel:

    <document>
    <no>27</no>
    <title>Off-road motorcycle trail</title>
    <content>This highway is an amzing road!&lt;br /&gt;&#xa;you can find more about it online.</content>
    </document>


    Forme ich den Text mit XSLT um bekomme ich:


    This highway is an amazing road! <br />
    you can find more about it online.


    Die <br />-Elemente möchte ich möglichst einfach entfernt haben.
    Habe schon gegoogelt, aber konnte keine einfache Lösung finden... viele Dank für Tipps!

  • #2
    Wenn es sich um ein Vorkommen handelt, dann probiere es so:
    Code:
    <xsl:value-of select="concat(substring-before(.,'&lt;'),' ',substring-after(.,'&#xA;'))"/>
    Ergebnis: This highway is an amzing road! you can find more about it online.

    Ansonsten mittels xsl:call-template rekursiv zerlegen.

    Comment


    • #3
      Vielen Dank für den Lösungsansatz. Da es sich um mehr als ein Vorkommen handelt, habe ich es mit call-template probiert, allerdings mache ich da was falsch, da es trotzdem immer noch nur für das erste Vorkommen angewendet wird.

      Hier das umzuwandelnde XML-Dokument:

      Code:
      <document>
      <no>27</no>
      <title>Off-road motorcycle trail</title>
      <content>This highway is an amzing road!&lt;br /&gt;&#xa;you can find more about it online.</content>
      </document>
      Hier mein XSLT-Skript:

      HTML Code:
      <?xml version="1.0" encoding="UTF-8"?>
      <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
          xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="1.0">
         
          <xsl:template match="/">
              <xsl:apply-templates select="document"/>
          </xsl:template>
          
          <xsl:template name="rem">
              <xsl:value-of select="concat(substring-before(.,'&lt;'),' ',substring-after(.,'&#xA;'))"/> 
          </xsl:template>
          
          <xsl:template match="no">
              <xsl:for-each select="title">
              <xsl:call-template name="rem"/>
              </xsl:for-each>
              </xsl:template>
      
          <xsl:template match="content">
              <xsl:for-each select="title">
              <xsl:call-template name="rem"/>
              </xsl:for-each>
              </xsl:template>
      
      </xsl:stylesheet>
      Alternativ hatte ich davor:


      <?xml version="1.0" encoding="UTF-8"?>
      <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="1.0">
      <xslutput method="text"/>


      <xsl:template match="/">
      <xsl:apply-templates select="document"/>
      </xsl:template>

      <xsl:template match="no">
      "<xsl:value-of select="title"/>", "<xsl:value-of select="content"/>"
      <xsl:text>
      </xsl:text>
      </xsl:template>


      </xsl:stylesheet>



      Allerdings werden wie geschrieben die <br />-Elemente nur für die ersten Vorkommen eliminiert. Hast du noch eine Idee, Thomas?
      Zuletzt editiert von bchica; 31.03.2010, 00:22.

      Comment


      • #4
        Originally posted by bchica View Post
        ... Habe schon gegoogelt, aber konnte keine einfache Lösung finden... viele Dank für Tipps!
        In den XSLT-FAQ findet man hier unter "Replace" beispielsweise das Template mit dem Namen "replace-string", das du 1:1 übernehmen könntest.

        Comment


        • #5
          Originally posted by hela View Post
          In den XSLT-FAQ findet man hier unter "Replace" beispielsweise das Template mit dem Namen "replace-string", das du 1:1 übernehmen könntest.

          Vielen Dank für den Link. Allerdings dachte ich, es wäre evtl. "einfacher" was heißt code-sparender zu lösen. Also beispielsweise über eine for-each Schleife und replace... ist sowas mit XSLT möglich?

          Comment


          • #6
            Originally posted by bchica View Post
            Vielen Dank für den Link. Allerdings dachte ich, es wäre evtl. "einfacher" was heißt code-sparender zu lösen. Also beispielsweise über eine for-each Schleife und replace... ist sowas mit XSLT möglich?
            Schleifen gibt es in XSLT nicht. Mit XSLT 1.0 musst du ein rekursives Template nehmen. Mit XSLT 2.0 kann man einfach die in XPath 2.0 definierte replace Funktion nehmen.

            Comment


            • #7
              Vielen Dank für die Tipps. Dann werde ich mich mal mit den call-templates beschäftigen und versuchen mir eines zusammenbasteln.

              Comment

              Working...
              X