snow_white: XSLT / XML to XML / Output / XPath?

Hallo,
ich habe bei meiner Transformation von XML in XML ein kleines Problem.
Und zwar wird der Titel aus dem XML-Dokument im Body-Tag ausgegeben, obwohl ich das im XSLT-Dokument
überhaupt nicht schreibe.
Ich dachte erst, dass es ein XPath-Problem ist, aber mit dem XPath-Validator im AltovaXMLSpy habe ich meinen XPath-Ausdruck überprüft.
Kann mir eventuell jemand weiterhelfen.
Ich verstehe einfach nicht, warum der Titel im Body-Tag vor den P-Tags ausgegeben wird.:-/

XML:
...
<topic>
<title>Überschrift </title>
<body>
<p>text text</p>
<p>text text text</p>
</body>
</topic>

XSLT:
...
<xsl:template match="/">
<topic>
<title>
<xsl:apply-templates select="//title"/>
</title>
<body>
xsl:apply-templates/
</body>
</topic>
</xsl:template>
<xsl:template match="//body/p">
<xsl:value-of select="//p/node()" />
</xsl:template>
...

Output:
<topic>
<title>Überschrift</title>
<body>
Überschrift
<p>text text</p>
<p>text text text</p>
</body>
</topic>

Dann habe ich noch eine Frage.
Im AltovaXMLSpy funktioniert das Stylesheet, aber im Cooktop nicht.
Liegt das eventuell wieder an der Engine?
Vielen Dank auf jeden Fall für Eure Hilfe.
Viele Grüße
snow_white

  1. Hallo,

    ich habe bei meiner Transformation von XML in XML ein kleines Problem.
    Und zwar wird der Titel aus dem XML-Dokument im Body-Tag ausgegeben, obwohl ich das im XSLT-Dokument
    überhaupt nicht schreibe.

    Doch das machst du ;-)

    Ich dachte erst, dass es ein XPath-Problem ist, aber mit dem XPath-Validator im AltovaXMLSpy habe ich meinen XPath-Ausdruck überprüft.
    Kann mir eventuell jemand weiterhelfen.
    Ich verstehe einfach nicht, warum der Titel im Body-Tag vor den P-Tags ausgegeben wird.:-/

    XML:
    ...
    <topic>
    <title>Überschrift </title>
    <body>
    <p>text text</p>
    <p>text text text</p>
    </body>
    </topic>

    XSLT:
    ...
    <xsl:template match="/">
    <topic>
    <title>
    <xsl:apply-templates select="//title"/>
    </title>
    <body>
    xsl:apply-templates/
    </body>
    </topic>
    </xsl:template>
    <xsl:template match="//body/p">
    <xsl:value-of select="//p/node()" />
    </xsl:template>
    ...

    <xsl:template match="/">

    Du selektierst damit das Dokument selbst, dann:

    <body>
      xsl:apply-templates/
    </body>

    Damit aktiverst du quasi alles Templates, so auch die build-in Templates vom XSL und weil du im "Dokument" selbst bist, werden hier alle Templates ausgeführt. Zu guter letzt beduetet das, dass der Textinhalt von Elementen ausgeben wird.

    Dein <xsl:apply-templates select="//title"/> macht auch nichts anderes als genau das (sofern du kein <template match=title"> hast), nämlich auf die buil-in Templates zu vertrauen und so letztlich den Text vom <title> ausgeben.

    Grüße
    Thomas

    PS: die vielen Selektionen mit "//element"  sind wirklich nicht sehr schön, und meistens auch unnötig.

    1. Hallo Thomas,
      vielen Dank für Deine Hilfe.:o)
      Ich habe jetzt zwei XSLT-Dateien (Aufruf mit xsl:include) aus meiner XSLT-Datei gemacht.
      Hättest Du das auch so gemacht?
      Oder wie hättest Du das Problem gelöst?
      Auf jeden Fall funktionieren meine Ausgabe jetzt.
      Und nun wird auch nicht mehr der Titel im Body-Tag ausgegeben.*freu*

      Die Selektionen mit "//element" habe ich geändert.
      Also, XPath: //body/p in XPath: p
      Und funktioniert auch.*freu*

      Vielen Dank noch einmal.
      Viele Grüße
      snow_white

      1. Hallo,

        Hallo Thomas,
        vielen Dank für Deine Hilfe.:o)
        Ich habe jetzt zwei XSLT-Dateien (Aufruf mit xsl:include) aus meiner XSLT-Datei gemacht.
        Hättest Du das auch so gemacht?

        Das weiss ich nicht, weil ich nicht weiss wie dein XSL aufgebaut ist.

        Oder wie hättest Du das Problem gelöst?
        Auf jeden Fall funktionieren meine Ausgabe jetzt.
        Und nun wird auch nicht mehr der Titel im Body-Tag ausgegeben.*freu*

        Die Selektionen mit "//element" habe ich geändert.
        Also, XPath: //body/p in XPath: p
        Und funktioniert auch.*freu*

        <topic>
        <title>Überschrift </title>
        <body>
        <p>text text</p>
        <p>text text text</p>
        </body>
        </topic>

        XSLT:

        <xsl:template match="/topic">
           <topic>
              <title><xsl:value-of select="title"/></title>
              <xsl:apply-templates select="body" />
           </topic>
        </xsl:template>

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

        <xsl:template match="p">
           <p>
              <xsl:value-of select="."/>
           </p>
        </xsl:template>

        Grüße
        Thomas

        1. Hallo Thomas,
          vielen Dank für Deine Hilfe.
          Dein XSLT-Dokument funktioniert auch sehr gut für meine Ausgabe!:o)
          Viele Grüße
          snow_white