Announcement

Collapse
No announcement yet.

Plain Text Extrahierung mit XSLT

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

  • Plain Text Extrahierung mit XSLT

    Hallo Leute,

    ich habe folgendes Problem. Ich soll den Plain-Text aus einem HTML document extrahieren. Leider schaffe ich es aus irgendeinem Grund nicht. Für mich ist es wichtig nach Elementen wie z.B. p, br, hr usw eine new line zu hinzufügen. Tabellen, Bilder, Links sind nicht wichtig. Hier ist meine XSLT-Script die ich geschrieben habe - leider funktioniert nicht.

    <code>

    <?xml version="1.0" encoding="UTF-8"?>

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xslutput method="text" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:template match="/">
    <xsl:apply-templates select="html/body"/>
    </xsl:template>
    <xsl:template match="html/body">
    <xsl:for-each select="child::*">
    <xsl:element name="{name()}">
    <xsl:choose>
    <xsl:when test="name()='p'"><xsl:value-of select="concat(.,'&#xd;')"/></xsl:when>
    <xsl:when test="name()='br'"><xsl:value-of select="concat(.,'&#xd;')"/></xsl:when>
    <xsl:when test="name()='hr'"><xsl:value-of select="concat(.,'&#xd;&#xd;')"/></xsl:when>
    <xsl:when test="name()='div'"><xsl:value-of select="concat(.,'&#xd;')"/></xsl:when>
    <xsl:when test="name()='h3'"><xsl:value-of select="concat('&#xd;',.,'&#xd;&#xd;')"/></xsl:when>
    <xsltherwise><xsl:value-of select="."/></xsltherwise>
    </xsl:choose>
    <!--xsl:value-of select="."/-->
    </xsl:element>
    </xsl:for-each>
    </xsl:template>
    </xsl:stylesheet>

    </code>

    Das Problem mit dieser Script ist es, dass ich nur den ersten Paragraph bekomme und der Rest des Dokumentes wird ignoriert.

    Danke für jede Hilfe,
    erno

  • #2
    Warum werden mit xsl:element Elemente erzeugt, wenn es um die Textknoten geht und überhaupt method="text" gewählt ist? Probiere diesen Ansatz in angepasster Form:
    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="UTF-8" indent="yes"/>
    
      <xsl:template match="text()">
        <xsl:value-of select="."/><xsl:text>&#xA;</xsl:text>  
      </xsl:template>
    
      <!-- auszuschließende Elemente -->
      <xsl:template match="*[local-name()='td' or local-name()='span']"/>
    
    </xsl:stylesheet>

    Comment


    • #3
      Das Problem ist wie schon beschrieben: den Text-Inhalt zu extrahieren und nach jedem br, hr usw eine neue Linie zu hinzufügen. Dein Code funktioniert perfekt aber... Was passiert, wenn ich mehrmals br Tag hintereinander habe? Ich muss für jeden diesen Tag eine newline in mienen Output hinzufügen. Reicht es, wenn ich noch ein xsl:template Tag verwende nur für diese einezelnen Fälle? z.B:

      <xsl:templyte match="br">
      <xsl:value-of select "."><xsl:text>&#xA;</xsl:text></...>

      Danke,
      erno

      Comment


      • #4
        Da br ein leeres Element darstellt, gibt es auch keinen Textknoten. Hier sollte reichen:
        Code:
        <xsl:template match="br">
          <xsl:text>&#xA;</xsl:text>  
        </xsl:template>

        Comment


        • #5
          Hallo Thomas,

          danke für deine Antworten. Mit dieser XSLT bekomme ich aber auch new lines nach html, body usw. tags. Z.B. wenn ich folgendes Dokument habe:

          Code:
          <html>
          <head>
          </head>
          <body>
           <p><b>test 1</b></p>
            test 2
            test 3
          </body>
          </html>
          als Output kriege ich folgendes:

          Code:
          \n -> html
          \n -> body
          \n -> b oder p
          test 1\n -> ok
          test 2\n -> ok
          test 3\n -> ok
          \n - keine Ahnung woher kommt das
          und hier ist meine XSLT:

          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="UTF-8" indent="yes"/>
          
            <xsl:template match="/">
                <xsl:apply-templates />
            </xsl:template>
          
            <xsl:template match="text()">
                <xsl:element name="result">
                  <xsl:value-of select="."/><xsl:text>&#xA;</xsl:text>
                </xsl:element>
            </xsl:template>
            <xsl:template match="*[local-name()='td' or local-name()='span' or local-name()='head']"/>
            <xsl:template match="br">
                <xsl:element name="result">
                  <xsl:text>peace</xsl:text>
                </xsl:element>
            </xsl:template>
          </xsl:stylesheet>
          Danke,
          erno

          Comment

          Working...
          X