PeterK: XSlt - Standalone-Elemente

Hallo.

Kann mir jemand sagen wie ich iun XSLT per xsl:element Slandalone-Elemente erzeugen kann? Wenn nämlich zwichen xsl:element und </xsl:element> nur Attribute stehen (keine Kindknoten), dann wird (zumindest bei der PHP-XSLT-Libary) ein Öffnendes Element ohne zugehöriges, schließendes Element ausgegeben. So wird z.B.

<xsl:element name="meta">
 <xsl:attribute name="name">
  xsl:textauthor</xsl:text>
 </xsl:attribute>
 <xsl:attribute name="content">
  <xsl:value-of select="/xdoc/head/author" />
 </xsl:attribute>
</xsl:element>

zu

<meta name="author" content="Peter Körner">

Ist das ein Bug oder ein Feature?? Und wie kann ich das Korrigieren??

Peter

--
Es gibt immer eine lösung - auch wenn sie keiner findet!!
Dat bin isch: ss:) zu:) ls:[ fo:| de:< va:| ch:? sh:) n4:~ rl:( br:$ js:| ie:) fl:)
  1. Hallo,

    Kann mir jemand sagen wie ich iun XSLT per xsl:element Slandalone-Elemente erzeugen kann?

    (es heisst Leerelemente)
    Wenn du <xsl:output method="xml" ... /> verwendest.

    Wenn nämlich zwichen xsl:element und </xsl:element> nur Attribute stehen (keine Kindknoten), dann wird (zumindest bei der PHP-XSLT-Libary) ein Öffnendes Element ohne zugehöriges, schließendes Element ausgegeben.

    Im normalfall, reagiert der XSLT-Prozessor auf xsl:output, dann wenn dies fehlt, auf das Wurzelelement des Ergebnisdokuments. Falls dieses "html" ist, wird ein HTML-Dokument erzeugt mit den Regel für HTML-Dokumente, sonst wird XML ausgegeben.

    Ist das ein Bug oder ein Feature??

    Weiss ich nicht, müsstest du austesten.

    Und wie kann ich das Korrigieren??

    Mit dem Einsatzt eines vollständigen XSLT-Prozessors und/oder mit xsl:output http://selfhtml.teamone.de/xml/darstellung/xsltelemente.htm#output

    Grüße
    Thomas

  2. Hallo,

    So wird z.B.

    <xsl:element name="meta">
     <xsl:attribute name="name">
      xsl:textauthor</xsl:text>
     </xsl:attribute>
     <xsl:attribute name="content">
      <xsl:value-of select="/xdoc/head/author" />
     </xsl:attribute>
    </xsl:element>

    zu

    <meta name="author" content="Peter Körner">

    ... was bei der Ausgabe-Option html auch voellig korrekt ist, weil meta ein leeres Element ist.

    Ansonsten kannst Du das auch einfacher haben:
    <meta name="author" content="{/xdoc/head/author}" />

    MfG, Thomas

    --
    SVG - Learning By Coding
    http://www.datenverdrahten.de/svglbc/
    1. Ich wollte halt möglichst einen XHTML-Konformen Output haben, also echtes XML, und außerdem fand ich das mit xsl:element einfach sauberer als die Ausgabe mit Literal-Elementen.

      Naja, ok.
      Thx, Peter

      1. Hallo,

        Ich wollte halt möglichst einen XHTML-Konformen Output haben, also echtes XML,

        Das ist ja mit <meta ... /> auch gegeben.

        und außerdem fand ich das mit xsl:element einfach sauberer als die Ausgabe mit Literal-Elementen.

        Das ist keine Frage von sauber/unsauber, sondern von mehr/weniger aufwaendig.

        xsl:element waere z. B. bei der Erzeugung eines XSL-Dokuments mittels XSLT angezeigt, wenn also xsl:elementname neben (X)HTML-Elementen heraus kommen soll.

        Gerade bei vielen Attributen bevorzuge ich etwas wie (hier SVG):

        <circle cx="{...}" cy="{...}" r="{...}" fill="{...}" />

        gegenueber:

        <xsl:element name="circle">

        <xsl:attribute name="cx">
            <xsl:value-of select="..." />
          xsl:attribute

        <xsl:attribute name="cy">
            <xsl:value-of select="..." />
          xsl:attribute

        <xsl:attribute name="r">
            <xsl:value-of select="..." />
          xsl:attribute

        <xsl:attribute name="fill">
            <xsl:value-of select="..." />
          xsl:attribute

        </xsl:element>

        MfG, Thomas

        1. Hallo,

          sorry, Cut'n'Paste-Fehler bei </xsl:attribute>:

          gegenueber:

          <xsl:element name="circle">

          <xsl:attribute name="cx">
              <xsl:value-of select="..." />
            </xsl:attribute>

          <xsl:attribute name="cy">
              <xsl:value-of select="..." />
            </xsl:attribute>

          <xsl:attribute name="r">
              <xsl:value-of select="..." />
            </xsl:attribute>

          <xsl:attribute name="fill">
              <xsl:value-of select="..." />
            </xsl:attribute>

          </xsl:element>

          MfG, Thomas