Re: [xsl] For this input element, fire all matching template rules. Any way to fire multiple template rules for an input element?

Subject: Re: [xsl] For this input element, fire all matching template rules. Any way to fire multiple template rules for an input element?
From: Wolfgang Laun <wolfgang.laun@xxxxxxxxx>
Date: Tue, 20 Apr 2010 10:00:42 +0200
I don't know how close this is to your facet report, but it does
extract all facets, with @value and the ancestor (element, attribute,
simpleType, complexType) with which it should be reported. (Some
facets are missing.)
-W

<?xml version="1.0"?>
<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
    xmlns:xs="http://www.w3.org/2001/XMLSchema";
    xmlns:wl="wolfgang.laun">

<xsl:output method="text"/>

<xsl:function name="wl:report">
  <xsl:param name="ancestor"/>
  <xsl:param name="facetname"/>
  <xsl:param name="facetvalue"/>
  <xsl:value-of select="concat('in ',node-name($ancestor),
' ',$ancestor/@name,': ',$facetname,'=',$facetvalue)"/>
<xsl:text>
</xsl:text>
</xsl:function>

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

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

<xsl:template match="text()"/>

<xsl:template match="xs:minLength|xs:maxLength|
                     xs:minInclusive|xs:maxInclusive|
                     xs:enumeration">
  <xsl:variable name="ancestor" select="ancestor::*[@name][1]"/>
  <xsl:value-of select="wl:report($ancestor,node-name(.),./@value)"/>
</xsl:template>

</xsl:stylesheet>


On Mon, Apr 19, 2010 at 2:12 PM, Costello, Roger L. <costello@xxxxxxxxx>
wrote:
>
> Hi Folks,
>
> I have an XSLT program that analyzes XML Schema documents.
>
> My XSLT creates a report if an element that uses the maxLength facet. It
creates a (separate) report if the element uses the minLength facet. In fact,
it creates a separate report for each facet used.
>
> Consider this element declaration:
>
>    <element name="Author">
>        <simpleType>
>            <restriction base="string">
>                <minLength value="1" />
>                <maxLength value="256" />
>            </restriction>
>        </simpleType>
>    </element>
>
> What I really want is to create a template rule for each report:
>
>    <xsl:template
match="xs:element[xs:simpleType/xs:restriction/xs:minLength]">
>        <!-- report on the use of the minLength facet -->
>    </xsl:template>
>
>    <xsl:template
match="xs:element[xs:simpleType/xs:restriction/xs:maxLength]">
>        <!-- report on the use of the maxLength facet -->
>    </xsl:template>
>
>    <xsl:template
match="xs:element[xs:simpleType/xs:restriction/xs:enumeration]">
>        <!-- report on the use of the enumeration facet -->
>    </xsl:template>
>
>    <xsl:template
match="xs:element[xs:simpleType/xs:restriction/xs:pattern]">
>        <!-- report on the use of the pattern facet -->
>    </xsl:template>
>
>    Etc.
>
> And have all applicable rules fire. For the above example, the first two
rules should fire.
>
> Unfortunately this doesn't work. I get an error saying the XSLT program is
ambiguous because multiple rules are applicable.
>
> Is there any way to create an XSLT program and specify, "For this input
element, fire all matching template rules."
>
> /Roger

Current Thread