Hevelmann: xml als Text in einer xml Datei ?

Hallo Leute,

ich möchte mittels xslt ein xml-Dokument erstellen, in dem ein kompletter Knoten aus meinem xml-Quelldokument als Text dargestellt wird. Mittels <xsl:copy-of select="."/> kopiere ich den Knoten in mein Dokument, allerdings ist es ja jetzt noch kein Text sondern xml code.

Hat jemand eine Ahnung wie man sowas realisieren kann ???

Danke für jede Hilfe

Gruss Hevelmann

  1. Hallo Leute,

    ich möchte mittels xslt ein xml-Dokument erstellen, in dem ein kompletter Knoten aus meinem xml-Quelldokument als Text dargestellt wird. Mittels <xsl:copy-of select="."/> kopiere ich den Knoten in mein Dokument, allerdings ist es ja jetzt noch kein Text sondern xml code.

    Hat jemand eine Ahnung wie man sowas realisieren kann ???

    Danke für jede Hilfe

    Gruss Hevelmann

    Du musst die < > Zeichen codieren mit &gt und &lt, damit sie nicht interpretiert werden.

  2. Hallo Leute,

    ich möchte mittels xslt ein xml-Dokument erstellen, in dem ein kompletter Knoten aus meinem xml-Quelldokument als Text dargestellt wird. Mittels <xsl:copy-of select="."/> kopiere ich den Knoten in mein Dokument, allerdings ist es ja jetzt noch kein Text sondern xml code.

    XML _ist_ Text. Du meinst vermutlich, dass die Markup-Symbole nicht als solche interpretiert werden. Entweder jedes der Symbole maskieren (wie Susanne vorschlägt) oder CDATA-Abschnitte nutzen

    http://selfhtml.teamone.de/xml/regeln/zeichen.htm#cdata

    Gruß
    Franz

    1. Danke erstmal für die schnelle Antwort :-)

      Mit CDATA hab ich es auch schon probiert allerdings hat das nicht zum Erfolg geführt. Ich versuch mein Problem mal deutlicher darzustellen:

      Ich habe folgendes XML-Quelldokument (wird aus Lotus Notes 6 exportiert) hier ein Auszug:

      <view name="Testview">
       <noteinfo noteid="17e" unid="DE0D40FC4C565C67C1256C44003B35CA" sequence="2">
        <created>
         <datetime dst="true">20020930T124643,94+02</datetime>
        </created>
        <modified>
         <datetime dst="true">20020930T124713,49+02</datetime>
        </modified>
        <revised>
         <datetime dst="true">20020930T124713,48+02</datetime>
        </revised>
        <lastaccessed>
         <datetime dst="true">20020930T124713,48+02</datetime>
        </lastaccessed>
        <addedtofile>
         <datetime dst="true">20020930T124643,96+02</datetime>
        </addedtofile>
       </noteinfo>
       <updatedby>
        <name>Hevelmann</name>
       </updatedby>
       <wassignedby>
        <name>Hevelmann</name>
       </wassignedby>

      ...
      </view>

      mittels eines Stylesheets möchte ich diesen XML-Code abändern um ihn dann wieder in Notes zu importieren

      <xsl:template match="dxl:view">
       <document form="fmForm">
        <item name="XMLCode">
         <text>
          <![CDATA[
           <xsl:copy-of select="."/>
          ]]>
         </text>
        </item>

      ...

      </document>
      </xsl:template>

      benutze ich jetzt CDATA wie oben dargestellt bringt er mir als Ergebnis natürlich <xsl:copy-of select="."/> aber ich möchte ja als Ergebnis folgendes:

      <view name="Testview">
       <noteinfo noteid="17e" unid="DE0D40FC4C565C67C1256C44003B35CA" sequence="2">
        <created>
         <datetime dst="true">20020930T124643,94+02</datetime>
        </created>
        <modified>
         <datetime dst="true">20020930T124713,49+02</datetime>
        </modified>
        <revised>
         <datetime dst="true">20020930T124713,48+02</datetime>
        </revised>
        <lastaccessed>
         <datetime dst="true">20020930T124713,48+02</datetime>
        </lastaccessed>
        <addedtofile>
         <datetime dst="true">20020930T124643,96+02</datetime>
        </addedtofile>
       </noteinfo>
       <updatedby>
        <name>Hevelmann</name>
       </updatedby>
       <wassignedby>
        <name>Hevelmann</name>
       </wassignedby>

      ...
      </view>

      und ich hab keine Ahnung wie ich das bewerkstelligen soll.

      Ich hoffe Ihr könnt mir weiterhelfen.

      Gruss Hevelmann

      1. Hallo

        <xsl:template match="dxl:view">
        <document form="fmForm">
          <item name="XMLCode">
           <text>
            <![CDATA[
             <xsl:copy-of select="."/>
            ]]>
           </text>
          </item>

        ...

        </document>
        </xsl:template>

        So geht's

        <![CDATA[
          <xsl:copy-of select="."/>
        ]]>

        Gruß
        Franz

        1. Hallo Franz, hallo Hevelmann,

          » So geht's

          <![CDATA[
            <xsl:copy-of select="."/>
          ]]>

          Nein, denn so wird CDATA zum Text und er hat bloß mixed content.

          Aber so geht es! ;-)
          Grüße
          Thomas
          ---------------------------

          <?xml version="1.0" encoding="iso-8859-1"?>
          <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
          <xsl:output method="xml" indent="yes" encoding="iso-8859-1" />

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

          <xsl:template match="view">
           <document form="fmForm">
            <item name="XMLCode">
             <text>
                 <![CDATA[<]]><xsl:value-of select="name()" /><xsl:for-each select="attribute::*">&#160;<xsl:value-of select="name()" />="<xsl:value-of select="." />"</xsl:for-each><![CDATA[>]]>
           <xsl:apply-templates select="child::*" />
           <![CDATA[</]]><xsl:value-of select="name()" /><![CDATA[>]]>
             </text>
            </item>
           </document>
          </xsl:template>

          <xsl:template match="view//*">
                 <![CDATA[<]]><xsl:value-of select="name()" /><xsl:for-each select="attribute::*">&#160;<xsl:value-of select="name()" />="<xsl:value-of select="." />"</xsl:for-each><![CDATA[>]]>
           <xsl:if test="contains(., child::*)">
            xsl:apply-templates/
           </xsl:if>
           <xsl:if test="not(contains(., child::*))">
                  <![CDATA[<]]><xsl:value-of select="name()" /><xsl:for-each select="attribute::*">&#160;<xsl:value-of select="name()" />="<xsl:value-of select="." />"</xsl:for-each><![CDATA[>]]>
            <xsl:value-of select="." />
            <![CDATA[</]]><xsl:value-of select="name()" /><![CDATA[>]]>
           </xsl:if>
           <![CDATA[</]]><xsl:value-of select="name()" /><![CDATA[>]]>
          </xsl:template>

          </xsl:stylesheet>

          1. Hallo an alle die sich meinem Problem angenommen haben.

            Tausend Dank für Eure Mühe, Ihr habt mir sehr weiter geholfen.

            Gruss Hevelmann

          2. Hallo Thomas,

            <![CDATA[
              <xsl:copy-of select="."/>
            ]]>

            Nein, denn so wird CDATA zum Text und er hat bloß mixed content.

            wollte er doch auch, oder?

            Für einen XML-Parser ist

            <view name="Testview"gt;

            äquvalent zu

            <![CDATA[<view name="Testview">]]>

            In beiden Fällen hasst du nur mixed content, da du die Markup-Symbole maskierst.

            Gruß
            Franz

          3. Hallo,

            Nein, denn so wird CDATA zum Text und er hat bloß mixed content.

            Ahhhh, jetzt hab ich verstanden, was du damit meinst. Logo:
            a) wenn ich <![CDATA [...]]> in einem Stylesheet verwende, wird der Inhalt als Text interpretiert und xsl:copy-of funktioniert nicht mehr
            b) wenn ich <![CDATA[...]]gt; schreibe umgehe ich zwar das Problem in A, erhalte aber dafür keine als Text (nicht als Markup) interpretierte Ausgabe

            Naja, das hat jetzt wahrscheinlich eh jeder schon verstanden ausser mir ;-)

            OK, dann bis zum nächsten mal...
            Gruß
            Franz

          4. Hi Leute,

            danke nochmal für Eure Hilfe. Ich hab mich gleich dran gesetzt und aus euren Vorschlägen und Tipps auch ein template zusammengebastelt:

            <xsl:template name="XMLtoTEXT">
               <xsl:for-each select="descendant-or-self::*">
                < <xsl:value-of select="name()" />
                 xsl:choose
                  <xsl:when test="child::text()">
                   <xsl:for-each select="attribute::*">&#160;<xsl:value-of select="name()" />="<xsl:value-of select="." />"
                   </xsl:for-each>
                   ><xsl:value-of select="child::text()"/>>
                  </xsl:when>
                  xsl:otherwise
                   <xsl:for-each select="attribute::*">&#160;<xsl:value-of select="name()" />="<xsl:value-of select="." />"</xsl:for-each>>
                  </xsl:otherwise>
                 </xsl:choose>
                </xsl:for-each></<xsl:value-of select="name()" />>
            </xsl:template>

            Damit ist es möglich auch Textknoten auszulesen.
            Was haltet Ihr davon ???

            Ach ja es funtioniert auch ohne CDATA

            Gruss Hevelmann