xsl-list
[Top] [All Lists]

RE: [xsl] How to check an element's type against an XSD simpleType and skip that element if it does not conform to the simpleType?

2013-07-16 08:24:14
Ah!

I just discovered the solution.

I am using oXygen to do the transformation. I made the following small tweak to 
oXygen. 

In the menu:

        Options / Preferences  

In the dialog box for Saxon-HE/PE/EE is a section titled "Saxon-EE specific 
options." In there is this:

        Validation of the source file ("-val"):

I set that to: Disable schema validation

TaDa!

Now the below XSLT program behaves exactly as desired: it filters out each ISBN 
element which has a value which is not schema-valid. 

Cool!

Thanks Ken, David, Andrew, and Michael!

------------------------------------------------------------
        This works!
------------------------------------------------------------
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
               xmlns:bk="http://www.books.org";
               exclude-result-prefixes="bk"
               version="2.0">
 
    <xsl:output method="xml"/>

    <xsl:import-schema namespace="http://www.books.org";
        schema-location="BookStore.xsd"/>

    <xsl:template match="/">
        <BookISBNs>
            <xsl:for-each select="/bk:BookStore/bk:Book/bk:ISBN">
                <xsl:if test=". castable as bk:ISBN-type">
                    <ISBN><xsl:value-of select="."/></ISBN>
                </xsl:if>
            </xsl:for-each>
        </BookISBNs>
    </xsl:template>

</xsl:transform>

-----Original Message-----
From: Costello, Roger L. 
Sent: Tuesday, July 16, 2013 9:13 AM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: RE: [xsl] How to check an element's type against an XSD simpleType and 
skip that element if it does not conform to the simpleType?

Michael Kay wrote:

you could read an (unvalidated) BOOKLIST and then iterate 
over the BOOK elements, validating each one in turn, catching 
any errors ... and then doing different processing based on 
whether the BOOK was valid or not.

I must not be understanding what you and David are suggesting. Below is an XSLT 
program which does (I think) what you guys are suggesting, but it still 
generates an error if the XML document has an ISBN element with a value that is 
not schema-valid. What is my XSLT program doing wrong?  /Roger

-----------------------------------------------------------------
   Check ISBN using "castable as"
-----------------------------------------------------------------
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
               xmlns:bk="http://www.books.org";
               exclude-result-prefixes="bk"
               version="2.0">
 
    <xsl:output method="xml"/>

    <xsl:import-schema namespace="http://www.books.org";
        schema-location="BookStore.xsd"/>

    <xsl:template match="/">
        <BookISBNs>
            <xsl:for-each select="/bk:BookStore/bk:Book/bk:ISBN">
                <xsl:if test=". castable as bk:ISBN-type">
                    <ISBN><xsl:value-of select="."/></ISBN>
                </xsl:if>
            </xsl:for-each>
        </BookISBNs>
    </xsl:template>

</xsl:transform>

-----Original Message-----
From: Michael Kay [mailto:mike(_at_)saxonica(_dot_)com] 
Sent: Tuesday, July 16, 2013 8:56 AM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Cc: Costello, Roger L.
Subject: Re: [xsl] How to check an element's type against an XSD simpleType and 
skip that element if it does not conform to the simpleType?


On 16 Jul 2013, at 13:29, David Carlisle wrote:

On 16/07/2013 13:07, Costello, Roger L. wrote:
Michael Kay wrote:

Unfortunately schema-aware processing in XQuery and XSLT doesn't
give you this capability.

Is there a workaround?

Is there is no way for an XSLT program to express: "Hey, validate xyz
against the XML Schema and if xyz is not schema-valid then discard
it." No way to express that?


Can't you just not validate the input, then test within the stylesheet
as you are testing an atomic/simple type.


Yes, in fact you could do it at a different granularity; you could read an 
(unvalidated) BOOKLIST and then iterate over the BOOK elements, validating each 
one in turn, catching any errors using try/catch, and then doing different 
processing based on whether the BOOK was valid or not.

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>
--~--


<Prev in Thread] Current Thread [Next in Thread>