snowwhite: XML -> XML / Attribute erzeugen / Unbekanntes Namespace-Präfix!?

Hallo,
ich möchte für mein Root-Element Attribute erzeugen. Dies ist eigentlich kein Problem.
Aber der Attributname xml:xsi muss einen Doppelpunkt enthalten und hier bekomme ich die Fehlermeldung:
"Unbekanntes Namespace-Präfix".
Wie kann ich denn dieses Problem beheben?

<xsl:element name="concept">
<xsl:attribute name="xmlns:xsi">
xsl:texthttp://www.w3.org/2001/XMLSchema-instance</xsl:text>
</xsl:attribute>
<xsl:attribute name="xml:lang">
xsl:texten-us</xsl:text>
</xsl:attribute>
<xsl:attribute name="xsi:noNamespaceSchemaLocation">
xsl:text../catalog/concept.xsd</xsl:text>
</xsl:attribute>

Vielen Dank im voraus.
Viele Grüße
snow_white

  1. Hallo,
    die Recommendation sagt:

    It is not an error to write:

    <xsl:attribute name="xmlns:xsl" namespace="file://some.namespace">http://www.w3.org/1999/XSL/Transform</xsl:attribute>

    However, this will not result in the namespace declaration xmlns:xsl="http://www.w3.org/1999/XSL/Transform" being output. Instead, it will produce an attribute node with local name xsl, and with a system-allocated namespace prefix mapped to the namespace URI file://some.namespace. This is because the namespace fixup process is not allowed to use xmlns as the name of a namespace node.

    So wie ich das sehe, musst du einen Namensraum entweder direkt im XSLT oder mit dem namespace-Tag einführen.

    1. Hallo,
      das folgende habe ich im Netz gefunden:

      Michael Kay wrote:
      "The only way to generate a namespace node in the result tree is by copying
      it from a source document or stylesheet. Normally this will happen
      automatically, of course, when the namespace node is needed. If you want to
      generate a namespace declaration that isn't referenced anywhere, then create
      a document that contains it, and use xsl:copy on the namespace node
      (provided your processor implements the XSLT 1.0 errata)."
      (http://www.stylusstudio.com/xsllist/200109/post80270.html)

      Viele Grüße
      snowwhite

  2. Hallo,

    ich möchte für mein Root-Element Attribute erzeugen. Dies ist eigentlich kein Problem.
    Aber der Attributname xml:xsi muss einen Doppelpunkt enthalten und hier bekomme ich die Fehlermeldung:
    "Unbekanntes Namespace-Präfix".
    Wie kann ich denn dieses Problem beheben?

    <concept xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xml:lang="en-us" xsi:noNamespaceSchemaLocation="../catalog/concept.xsd">
      bla
     </concept>

    Grüße
    Thomas

    1. Hallo Thomas,
      vielen Dank für Deine Antwort.

      <concept xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xml:lang="en-us" xsi:noNamespaceSchemaLocation="../catalog/concept.xsd">

      Genau das möchte ich raus bekommen.
      Da ich eine Transformation von XML nach XML vornehme, muss ich aber mit dem Attribut-Element arbeiten.

      Wenn ich es so schreibe, wie Du mir empfohlen hast, dann werden die Attribute nicht übernommen bei der Transformation:
      <xsl:element name="concept" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xml:lang="en-us"
      xsi:noNamespaceSchemaLocation="../catalog/concept.xsd">

      Ergebnis:
      <concept>

      Daher muss ich so etwas schreiben:
      <xsl:attribute name="xmlns:xsi"> xsl:texthttp://www.w3.org/2001/XMLSchema-instance</xsl:text>
      </xsl:attribute>
      Aber hier gibt es, wie gesagt, Probleme mit den Doppelpunkten.

      Viele Grüße
      snowwhite

      1. Tach snowwhite,

        Daher muss ich so etwas schreiben:
        <xsl:attribute name="xmlns:xsi"> xsl:texthttp://www.w3.org/2001/XMLSchema-instance</xsl:text>
        </xsl:attribute>
        Aber hier gibt es, wie gesagt, Probleme mit den Doppelpunkten.

        Probiere es so:

        <xsl:element name="concept">  
          <xsl:attribute name="xmlns" namespace="http://www.w3.org/2001/XMLSchema-instance">  
            <xsl:text>http://www.w3.org/2001/XMLSchema-instance</xsl:text>  
          </xsl:attribute>  
          <xsl:attribute name="xml:lang">  
            <xsl:text>en-us</xsl:text>  
          </xsl:attribute>  
          <xsl:attribute name="xsi:noNamespaceSchemaLocation" namespace="http://www.w3.org/2001/XMLSchema-instance">  
            <xsl:text>../catalog/concept.xsd</xsl:text>  
          </xsl:attribute>  
        </xsl:element>
        

        Ergebnis:

        <concept xml:lang="en-us" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../catalog/concept.xsd"/>

        Man liest sich,
        svg4you

        1. Hallo svg4you,
          vielen Dank für Deine Hilfe.

          Bei mir kommt folgendes Ergebnis raus:
          <concept
          xmlns:ns0="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ns0:xmlns="http://www.w3.org/2001/XMLSchema-instance" xml:lang="en-us" xsi:noNamespaceSchemaLocation="../catalog/concept.xsd"/>

          Und mit der Engine Saxon geht es leider gar nicht.:-/
          Welche Engine benutzt Du für die Transformation?

          Viele Grüße
          snowwhite

          1. Tach snowwhite,

            Und mit der Engine Saxon geht es leider gar nicht.:-/
            Welche Engine benutzt Du für die Transformation?

            Das Ergebnis kam mit dem eingebauten Prozessor von XMLSpy 2006 zustande. Mit Saxon 8.9B klappt das Genannte auch nicht, aber dieser XSLT 2.0-Ansatz mit dem Element xsl:namespace:

            <?xml version="1.0" encoding="ISO-8859-1"?>  
            <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">  
              
            <xsl:template match="/">  
              
              <xsl:element name="concept">  
              
                <xsl:namespace name="xsi">http://www.w3.org/2001/XMLSchema-instance</xsl:namespace>  
              
                <xsl:attribute name="xml:lang">  
                  <xsl:text>en-us</xsl:text>  
                </xsl:attribute>  
              
                <xsl:attribute name="xsi:noNamespaceSchemaLocation">  
                  <xsl:text>../catalog/concept.xsd</xsl:text>  
                </xsl:attribute>  
              
              </xsl:element>  
              
            </xsl:template>  
              
            </xsl:stylesheet>
            

            Man liest sich,
            svg4you

      2. Hallo,

        <concept xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xml:lang="en-us" xsi:noNamespaceSchemaLocation="../catalog/concept.xsd">

        Genau das möchte ich raus bekommen.
        Da ich eine Transformation von XML nach XML vornehme, muss ich aber mit dem Attribut-Element arbeiten.

        Wer sagt das?
        Du liest weder die Attributnamen noch die Attributwerte aus dem XML heraus.
        Alles was im XSL nicht mit xsl: beginnt gilt als "für die Ausgabe bestimmt".
        Statt also mit xsl:element und xsl:attribute zu arbeiten, kannst du dein Element direkt so in dein XSL schreiben wie ich es dir zeigte.

        Grüße
        Thomas

        1. Hallo Thomas,

          Alles was im XSL nicht mit xsl: beginnt gilt als "für die Ausgabe bestimmt".

          Ok, das wußte ich nicht. Sorry.
          Ich habe es jetzt so gemacht, wie Du es geschrieben hast, und es hat funktioniert.
          Vielen vielen Dank.:o)

          Viele Grüße
          snowwhite