liri: Knoten im Knoten?!?

Hallo

ich habe folgendes Problem:
Ich versuche mit dem MSXML-Parser folgende XML-Zeile in ein neues XML-File zu exportieren...

XML : <B>Überblick der Geschäftsresultate <Sup>1)</Sup></B>
      (B für BoldText, Sup für hochgestellter Text)

XSL:<xsl:if test="count(./B) >=1">
         xsl:text<InhaltBold></xsl:text>
               <xsl:copy-of select="./B" />
               <xsl:copy-of select="./B/Sup" />
          xsl:text</InhaltBold></xsl:text>
      </xsl:if>

Frage: Wie schaffe ich es, dass mir "<Sup>1)</Sup>" ebenfalls in
den <B>-String übernommen wird; oder wie kann ich den <B>-String
ohne "1)" übernehmen?

Bin dankbar für alle Tipps, das Problem nervt mich schon eine Weile.
Danke und Grüsse
liri

  1. Hi liri,

    Frage: Wie schaffe ich es, dass mir "<Sup>1)</Sup>" ebenfalls in
    den <B>-String übernommen wird; oder wie kann ich den <B>-String
    ohne "1)" übernehmen?

    Ich verstehe ehrlich gesagt nicht, welches Problem es gibt. Durch <xsl:copy-of select="./B" /> wird bei mir auch der enthaltene Node kopiert.

    Welche Version von MSXML verwendest du denn? Ich hab's mit MSXML3 und MSXML4 probiert, beide Male kam als Ergebnis die Zeile

    <InhaltBold><B>Uberblick der Geschaftsresultate <Sup>1)</Sup></B><Sup>1)</Sup></InhaltBold>

    raus. Das zweite <Sup>1)</Sup> wurde vom zweiten xsl:copy-of erzeugt.

    Gruß,
    Martin

    1. Hi liri,

      Frage: Wie schaffe ich es, dass mir "<Sup>1)</Sup>" ebenfalls in
      den <B>-String übernommen wird; oder wie kann ich den <B>-String
      ohne "1)" übernehmen?

      hi martin

      danke für deine antwort. ich hätte gerne eine der folgenden ausgaben:

      <InhaltBold>Uberblick der Geschaftsresultate<Sup>1)</Sup></InhaltBold>
      oder noch lieber...
      <InhaltBold>Uberblick der Geschaftsresultate</InhaltBold><Sup>1)</Sup>

      kriegst du das auch hin? wär super!
      grüsse
      liri

      1. Hi liri,

        danke für deine antwort. ich hätte gerne eine der folgenden ausgaben:

        <InhaltBold>Uberblick der Geschaftsresultate<Sup>1)</Sup></InhaltBold>
        oder noch lieber...
        <InhaltBold>Uberblick der Geschaftsresultate</InhaltBold><Sup>1)</Sup>

        entweder einfach (für die erste Wahl):

        <xsl:if test="count(./B) >=1">
          <InhaltBold>
            <xsl:copy-of select="./B" />
          </InhaltBold>
        </xsl:if>

        oder wenn's das zweite sein, ohne das schließende </InhaltBold>-Tag:

        <xsl:if test="count(./B) >=1">
          <xsl:text disable-output-escaping="yes"><InhaltBold></xsl:text>
            <xsl:copy-of select="./B" />
        </xsl:if>

        Du musst dann halt aufpassen, dass du irgendwann ein passendes </InhaltBold> erzeugst, sonst kommt kein gültiges XML als Ergebnis raus.

        Gruß,
        Martin

        1. Hi martin,

          <xsl:if test="count(./B) >=1">
            <InhaltBold>
              <xsl:copy-of select="./B" />
            </InhaltBold>
          </xsl:if>

          In diesem FAlle wird mir das <Sup>-Element nicht eingefügt, sondern nur der Inhalt "1)"

          oder wenn's das zweite sein, ohne das schließende </InhaltBold>-Tag:

          Ich möchte </InhaltBold>-Tag nicht weglassen; sondern...
          <InhaltBold>blabla</InhaltBold> und <Sup>1)</Sup> ausgeben.

          <xsl:if test="count(./B) >=1">
            <xsl:text disable-output-escaping="yes"><InhaltBold></xsl:text>
              <xsl:copy-of select="./B" />
          </xsl:if>

          kann man disable auch für <xsl:element disable-output-escaping="yes">
          oder so ähnlich anwenden?

          Gruß,
          liri

          1. Hi liri,

            In diesem FAlle wird mir das <Sup>-Element nicht eingefügt, sondern nur der Inhalt "1)"

            Hm. Was für eine putput-method benutzt du denn?

            Ich möchte </InhaltBold>-Tag nicht weglassen; sondern...
            <InhaltBold>blabla</InhaltBold> und <Sup>1)</Sup> ausgeben.

            Jetzt steh ich auf dem Schlauch. Schreib doch mal hin, was genau im Ergebnis stehen soll. Und welche output-method du verwendest, bzw. wer das vorhandene XML weiter verwenden soll.

            Gruß,
            Martin

            1. Hi martin,

              Der Teufel liegt im Detail:
              Dieser String steht in einem Excel(XP)XML:
              <B>Überblick der Geschäftsresultate <Sup>1)</Sup></B>

              Über ein XSL-Sheet versuche ich das anständig zu formen:
              XSL:<xsl:if test="count(./B) >=1">
                       xsl:text<InhaltBold></xsl:text>
                             <xsl:copy-of select="./B" />
                        xsl:text</InhaltBold></xsl:text>
                    </xsl:if>
              Resultat: <InhaltBold>Überblick der Geschäftsresultate 1)</InhaltBold>

              Problem: Ich kriege es nicht hin, dass die <Sub> Klammern übernommen werden, Sie werden einfach aufgelöst, resp. ich kann <Sup>1)</Sup> nicht aus diesem String herauslösen.

              Genau so sollte es eigentlich rauskommen:
              <InhaltBold>Überblick der Geschäftsresultate<Sup>1)</Sup></InhaltBold>

              Gruß,

              liri

              1. Hi nochmals,

                ich benutze TEXT als Output-Methode, weil ich die
                ursprünglichen Tags <B> durch meine <InhaltBold> ersetzen will.

                Gruß,
                liri

                1. Hi,

                  ich benutze TEXT als Output-Methode, weil ich die
                  ursprünglichen Tags <B> durch meine <InhaltBold> ersetzen will.

                  Diese output-Methode ist der Grund warum es nicht funktioniert mit xsl:copy-of.

                  Die output-Methode liefert dir nur die Tectinalte der Elemente. Klar, dass dann die Tags geschluckt werden.

                  Gruß
                  Franz

                2. Hi liri,

                  ich benutze TEXT als Output-Methode, weil ich die
                  ursprünglichen Tags <B> durch meine <InhaltBold> ersetzen will.

                  Franz hat recht, das ist das Problem. Habs's eben probiert, mit dem XSL klappt's genauso wie du wolltest:

                  <?xml version="1.0"?>
                  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
                  <xsl:output method = "xml" />
                  <xsl:template match="/">
                    <xsl:if test="count(./B) >=1">
                      <InhaltBold>
                        <xsl:copy-of select="./B" />
                      </InhaltBold>
                    </xsl:if>
                  </xsl:template>
                  </xsl:stylesheet>

                  Die Methode text solltest du nur verwenden, wenn du wirklich Text erzeugen willst, also z.B. eine Liste mit komma-separierten Werten, eine INI-Datei, usw. Oder ein XML-Fragment, was für sich alleine kein gültiges XML darstellt. Wenn du aber XML willst, solltest du auch XML angeben.

                  Achja, obiges Beispiel hab ich getestet mit MSXML3 und MSXML4. MSXML 2.6 sollte man eh nicht mehr einsetzen.

                  Gruß,
                  Martin

                3. Hi nochmal.

                  Mist! Hab nicht aufgepasst. Du wolltest ja die <B> Tags nicht. Dafür musst du einfach nur statt xsl:copy-of xsl:value-of benutzen. Das ist alles.

                  Gruß,
                  Martin

                4. Isch werd nochmal bleede. Da muss ich wohl mein schlaues Buch konsultieren. Aber das liegt daheim :-(

                  Also bis heute Abend! Wär doch gelacht.

                  Gruß,
                  Martin

                  1. GENAU!!! Aber das mit der Output-Methode stimmt allemal.
                    Ich werd bis dahin mal alles anpassen.
                    Bis Später,danke.

                    Gruß,

                    liri

                    1. Hi liri,

                      ich hab wohl den Mund zu voll genommen. Ich krieg's jedenfalls nicht hin. Langsam habe ich das Gefühl, das wäre eine Aufgabe für XQuery, den nächsten Standard rund um XML. Der ist leider erst in der Mache :-(

                      Vielleicht kriegst du was mit den String-Funktionen hin. Wenn es sich nur um <Sup> handelt müsste da was zu machen sein. Ich hab nur die Befürchtung, dass dem nicht so ist.

                      Die Krux mit dem Beispiel ist die Mischung von Text und Child-Knoten.

                      Gruß,
                      Martin

                      1. Hi Martin,

                        Trotzdem vielen Dank.

                        Gruß,
                        liri