|
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 |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] For this input element, f, David Carlisle | Thread | [xsl] Name of current mode, Christian Roth |
| Re: [xsl] Name of current mode, Wendell Piez | Date | [xsl] entities in decimal-format/fo, Михаил Сабуренков |
| Month |