Announcement

Collapse
No announcement yet.

Ersezung von bestimmten Tags in XML mit XSLT

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

  • Ersezung von bestimmten Tags in XML mit XSLT

    Hallo,

    ich möchte in einer XML-Datei bestimmte Textabschnitte besonders mit XSLT ersetzen lassen.

    Konkret möchte ich innerhalb der XML-Datei code-Abschnitte haben, die mit XSLT zu HTML mit <code>MEIN TEXT</code> umgewandelt werden.

    Hat jemand eine Idee, wie sowas gemacht wird?

    Gruß,

    Robert
    Zuletzt editiert von robertnac; 03.04.2009, 18:51.

  • #2
    Wie soll das konkret aussehen (XML-Instanz und Ergebnis)?

    Comment


    • #3
      HTML Code:
      <element>mein text ist sehr interessant BEGIN System.out.println END mein text ist sehr interessant</element>
      soll zu

      HTML Code:
      <p>mein text ist sehr interessant <code>System.out.println </code>mein text ist sehr interessant</p>
      transformiert werden.

      Am besten soll im gesamten Dokument gesucht werden.

      Gruß,

      Robert

      Comment


      • #4
        Ansatz mit XSLT/XPath 2.0 und replace-Funktion:
        Code:
        <?xml version="1.0" encoding="UTF-8"?>
        <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
          xmlns:fn="http://www.w3.org/2005/xpath-functions"
          exclude-result-prefixes="fn">
        
          <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
        
          <xsl:template match="@* | node()">
            <xsl:copy>
              <xsl:apply-templates select="@* | node()"/>
            </xsl:copy>
          </xsl:template>
        
          <xsl:template match="element">
            <p><xsl:value-of select="fn:replace(fn:replace(.,'BEGIN\s','&lt;code&gt;'),'\sEND','&lt;/code&gt;')" disable-output-escaping="yes"/></p>  
          </xsl:template>
        
        </xsl:stylesheet>
        Ergebnis:
        Code:
        <?xml version="1.0" encoding="UTF-8"?>
        <p>mein text ist sehr interessant <code>System.out.println</code> mein text ist sehr interessant</p>
        Für 1.0 entsprechend ein rekursiv aufgerufenes Suchen/Ersetzen-Template verwenden (gab es hier schon öfter).

        Comment


        • #5
          Hallo,

          danke für die Antwort.

          Ich bekomme allerdings bei mir die nichtssagende Fehlermeldung


          (Position des Fehlers unbekannt)java.lang.IllegalArgumentException: argument type mismatch


          Eine Idee, woran es liegen kann?

          Robert

          Comment


          • #6
            Originally posted by robertnac View Post
            ... Eine Idee, woran es liegen kann?
            Keine Ahnung.
            Aber versuch es mal mit XSL v1:
            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="xml" encoding="UTF-8" indent="yes"/>
            
            <xsl:template match="@* | node()">
              <xsl:copy>
                <xsl:apply-templates select="@* | node()"/>
              </xsl:copy>
            </xsl:template>
            
            <xsl:template match="elem">
              <p>
                <xsl:call-template name="text2code">
                  <xsl:with-param name="text" select="."/>
                </xsl:call-template>
              </p>
            </xsl:template>
            
            <xsl:template name="text2code">
              <xsl:param name="text"/>
              <xsl:choose>
                <xsl:when test="contains($text,'BEGIN')">
                  <xsl:value-of select="substring-before($text,'BEGIN')"/>
                  <xsl:element name="code">
                    <xsl:value-of select="substring-before(substring-after($text,'BEGIN'),'END')"/>
                  </xsl:element>
                  <xsl:call-template name="text2code">
                    <xsl:with-param name="text" select="substring-after($text,'END')"/>
                  </xsl:call-template>
                </xsl:when>
                <xsl:otherwise>
                  <xsl:value-of select="$text"/>
                </xsl:otherwise>
              </xsl:choose>
            </xsl:template>
            
            </xsl:stylesheet>

            Comment

            Working...
            X