Re: [xsl] Transform all tags into attributes with some tags omitted

Subject: Re: [xsl] Transform all tags into attributes with some tags omitted
From: Michael Ludwig <mlu@xxxxxxxxxxxxx>
Date: Fri, 16 May 2008 09:24:58 +0200
Philipp Kursawe schrieb:

<xsl:for-each select="TAPOS|LGPLA|MATERIAL|MATKTXT|CHECKDIGIT|CHECKDIGIT2|CHECKDIGIT3|VSOLM|MEINS|PACKGROESSE"><xsl:call-template
name="item-element" /></xsl:for-each>

[...] I do not like the select statement for the tags. I would rather
like to describe the exceptions so that tag added in the future are
automatically added as attributes without changing the xslt.

Hi Philipp,


I'd use a special mode to the transform, which by default converts
elements to attributes and has exceptions in extra templates. Please
try and modify the following to suit your needs:

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
  <xsl:template match="@*|node()"><!-- identity template -->
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="item">
    <xsl:copy><!-- transform elements to attributes -->
      <xsl:apply-templates select="*" mode="attr"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="*" mode="attr"><!-- element to attribute -->
    <xsl:attribute name="{name()}">
      <xsl:value-of select="."/>
    </xsl:attribute>
  </xsl:template>
  <!-- exceptions to this rule go here -->
  <xsl:template match="MEINS | PACKGROESSE" mode="attr">
    <!-- dispatch to identity template -->
    <xsl:apply-templates select="."/>
  </xsl:template>
</xsl:stylesheet>

Michael Ludwig

Current Thread