Manuel_: dynamisch namespace schreiben

Hallo,

mir liegt folgendes Problem vor. Ich muss in eine Ausgabe als Textknoten einen Wert schreiben, der einen qname Ausdruck entspricht, bzw. besser gesagt prefix mit namen also etwa so

<wert>test:norm</wert>

Dass problem ist aber, dass sich der prefix dynamisch ergibt aber der namespace auflösbar, also angegeben werden muss. Ich brauch also als Ergebnis

<wert xmlns:test="nswert">test:norm</wert>

Mir steht leider nur Xalan mit XSLT1.0 zur Verfügung. Mit XSLT2.0 haette man ja xsl:namespace aber eben hier nicht verfuegbar. Ich moechte eigentlich auch vermeiden das Element "hart" zu schreiben. dummy attribute sind leider nicht zulässig, so dass ich auch nicht den Parser irgendwie zwingen kann, darueber einen namespace zu schreiben. Wie koennte man es nun dennoch irgendwie erreichen?

Gruss, Manuel

  1. Hallo,

    mir liegt folgendes Problem vor. Ich muss in eine Ausgabe als Textknoten einen Wert schreiben, der einen qname Ausdruck entspricht, bzw. besser gesagt prefix mit namen also etwa so

    <wert>test:norm</wert>

    Dass problem ist aber, dass sich der prefix dynamisch ergibt aber der namespace auflösbar, also angegeben werden muss. Ich brauch also als Ergebnis

    <wert xmlns:test="nswert">test:norm</wert>

    <xsl:element name="wert">
       <xsl:attribute name="concat('xmlns:',$nsPrefix)"><xsl:value-of select="$nsPrefix"/>:norm</xsl:attribute>
      </xsl:element>

    $nsPrefix kannst du dynamisch erstellen.

    Grüße
    Thomas

    1. Hallo,

      ja aber das wird ja gerade durch die Specs von XSLT1.0 nicht vorgesehen:

      http://www.w3.org/TR/xslt#creating-attributes

      XSLT processors may make use of the prefix of the QName specified in the name attribute when selecting the prefix used for outputting the created attribute as XML; however, they are not required to do so and, if the prefix is xmlns, they must not do so. Thus, although it is not an error to do:

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

      it will not result in a namespace declaration being output.

      Gruss, M.

      1. Hallo,

        ja aber das wird ja gerade durch die Specs von XSLT1.0 nicht vorgesehen:

        http://www.w3.org/TR/xslt#creating-attributes

        XSLT processors may make use of the prefix of the QName specified in the name attribute when selecting the prefix used for outputting the created attribute as XML; however, they are not required to do so and, if the prefix is xmlns, they must not do so. Thus, although it is not an error to do:

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

        it will not result in a namespace declaration being output.

        Ich schätze, ich habe dich missverstanden.

        <xsl:variable name="nsPrefix" select="'test'" />
          <xsl:variable name="nsURL" select="'http://www.example.com'" />

        Die eine Möglichkeit ist:
        <xsl:element name="{concat($nsPrefix, ':wert')}" namespace="{$nsURL}">
            <xsl:value-of select="concat($nsPrefix, ':norm')"/>
           </xsl:element>

        Was zu:  <test:wert xmlns:test="http://www.example.com">test:norm</test:wert> führt.

        oder du machst es auf die "unschöne" Art:

        <xsl:text disable-output-escaping="yes">&lt;wert xmlns:</xsl:text><xsl:value-of select="$nsPrefix" />xsl:text="</xsl:text><xsl:value-of select="$nsURL" /><xsl:text disable-output-escaping="yes">"&gt;</xsl:text>
            <xsl:value-of select="$nsPrefix" />:norm
           <xsl:text disable-output-escaping="yes">&lt;/wert&gt;</xsl:text>

        was zu <wert xmlns:test="http://www.example.com">test:norm</wert>

        Grüße
        Thomas

        1. Ja, genau diese unschöne Art (Kruecke mit disable-output...) wollte ich halt vermeiden. Aber es scheint wirklich kein weg daran vorbeizugehen.

          Danke, M.