There seem to be two separate questions here.
I have a xsl:function which :
- must return a element()
- has a string param "foobar".
I typed $foobar as xs:string but I'd like to restrict the possible
values to "foo" or "bar".
I know it's possible to define such a constrain in a xsd schema, but
is there a way to do that in xpath2 ?
You can declare a local type in your stylesheet:
<xsl:stylesheet xmlns:fb="urn:local:foobar" ....>
<xsl:import-schema>
<xs:schema targetNamespace="urn:local:foobar">
<xs:simpleType name="foobarType">
<xs:restriction base="xs:string">
<xs:enumeration value="foo"/>
<xs:enumeration value="bar"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
</xsl:import-schema>
<xsl:function name="igs:get-css-rule" as="element()">
<xsl:param name="foobar" as="fb:foobarType"/>
....
Note that when calling the function, you can't pass a string directly:
you will have to cast ot to fb:foobarType first.
This typing is important because the returned element() is selected
from a xsl:choose on $foobar value (with no otherwise) :
My code looks like :
<xsl:function name="igs:get-css-rule" as="element()">
<xsl:param name="foobar" as="xs:string"/> <!--(foo|bar)-->
<xsl:choose>
<xsl:when test="$foobar='foo'">
<xsl:sequence select="igs:get-my-foo-item()"/>
</xsl:when>
<xsl:when test="$css='bar'">
<xsl:sequence select="igs:get-my-bar-item()"/>
</xsl:when>
</xsl:choose>
</xsl:function>
And I get such a parsing error on my xslt :
XTTE0570: Conditional expression: If none of the conditions is
satisfied, an empty
sequence will be returned, but this is not allowed [...]
Typing the parameter unfortunately won't solve this problem. The
processor isn't clever enough to work out that the implicit "otherwise"
branch will never be executed, so it will still report a type error to
the effect that the implicit "otherwise" branch returns a value (namely
the empty sequence) which doesn't conform to the required return type of
the function. (There has been some suggestion that Saxon's type checking
here is too pessimistic; the type error should be raised dynamically if
this branch is taken, not statically). The easiest way around this is
probably to change the last xsl:when condition to an xsl:otherwise.
Michael Kay
Saxonica
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--