xsl-list
[Top] [All Lists]

Re: [xsl] Ways to simplify XSL, complex "select/filter criteria"

2010-01-07 18:54:49
It looks as if you were trying to cast the whole content of ns:PartyPlays as xs:dateTime (instead of casting just ns:startDateTime or ns:endDateTime).



J L schrieb:
Input xml was from Stefan Fritz's original post. The apostrophe is closed properly actually in the error message. Maybe Mr. Stefan Fritz can shed some light on this and share if he made the following xsl work. I'm using Altova.
Thanks.

[
Error in XPath 2.0 expression
Cast failed, invalid lexical value - '2005-09-19T00:00:00
                 ...

             ...
2010-09-19T00:00:00email1(_at_)my(_dot_)com2010-09-19T00:00:00email2(_at_)my(_dot_)com'


]

input:

<ns:Individual xsi:type="ns:Individual" xmlns:ns="http://myns"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>
    <ns:validFor xsi:type="ns:TimePeriod">
        <ns:startDateTime>1800-01-01T00:00:00</ns:startDateTime>
        <ns:endDateTime/>
    </ns:validFor>
    <ns:PartyPlays xsi:type="ns:Employee">
        <ns:validFor xsi:type="ns:TimePeriod">
            <ns:startDateTime>2005-09-19T00:00:00</ns:startDateTime>
            <ns:endDateTime/>
        </ns:validFor>
        <ns:PartyRoleContactableVia xsi:type="ns:PostalContact">
                 ...
</ns:PartyRoleContactableVia>
        <ns:PartyRoleContactableVia xsi:type="ns:PostalContact">
             ...
</ns:PartyRoleContactableVia>
        <ns:PartyRoleContactableVia xsi:type="ns:EMailContact">
            <ns:validFor xsi:type="ns:TimePeriod">
                <ns:endDateTime>2010-09-19T00:00:00</ns:endDateTime>
            </ns:validFor>
            <ns:eMailAddress>email1(_at_)my(_dot_)com</ns:eMailAddress>
        </ns:PartyRoleContactableVia>
        <ns:PartyRoleContactableVia xsi:type="ns:EMailContact">
            <ns:validFor xsi:type="ns:TimePeriod">
                <ns:endDateTime>2010-09-19T00:00:00</ns:endDateTime>
            </ns:validFor>
            <ns:eMailAddress>email2(_at_)my(_dot_)com</ns:eMailAddress>
        </ns:PartyRoleContactableVia>
    </ns:PartyPlays>
</ns:Individual>

xsl:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; xmlns:cdm="http://myns"; 
xmlns:f="urn:f" xmlns:xs="http://www.w3.org/2001/XMLSchema"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>
    <xsl:output method="text"/>
    <xsl:template match="/">
        <xsl:value-of select="/cdm:Individual/cdm:PartyPlays[f:type(.) eq 
xs:QName('fn:Employee')]  [exists(cdm:validFor[f:applies-now(.)])]"/>
    </xsl:template>
    <xsl:function name="f:applies-now" as="xs:boolean">
        <xsl:param name="v" as="element(cdm:validFor)"/>
        <xsl:variable name="start" as="xs:dateTime?" 
select="xs:dateTime($v/cdm:startDateTime)"/>
        <xsl:variable name="end" as="xs:dateTime?" 
select="xs:dateTime($v/cdm:endDateTime)"/>
        <xsl:sequence select="(empty($start) or $start le current-dateTime()) and 
(empty($end) or $end ge current-dateTime())"/>
    </xsl:function>
    <xsl:function name="f:type" as="xs:QName">
        <xsl:param name="e" as="element()"/>
        <xsl:sequence select="QName($e/@xsi:type, $e)"/>
    </xsl:function>
</xsl:stylesheet>



----------------------------------------
From: mike(_at_)saxonica(_dot_)com
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Date: Thu, 7 Jan 2010 22:08:06 +0000
Subject: RE: [xsl] Ways to simplify XSL, complex "select/filter criteria"


You'll have to give more context - I don't exactly remember this thread from
a previous decade ;-)

The apostrophe in the error message looks suspicious

invalid lexical value - '2005-09-19T00:00:00

Perhaps it's present in your data?

Regards,

Michael Kay
http://www.saxonica.com/
http://twitter.com/michaelhkay

-----Original Message-----
From: J L [mailto:jinlii(_at_)hotmail(_dot_)com]
Sent: 07 January 2010 18:57
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: RE: [xsl] Ways to simplify XSL, complex
"select/filter criteria"


I tried the transformation in Altova. It complains about
Error in XPath 2.0 expression Cast failed, invalid lexical
value - '2005-09-19T00:00:00
                 ...

             ...
2010-09-19T00:00:00email1(_at_)my(_dot_)com2010-09-19T00:00:00email2(_at_)my(_dot_)com'

If I change '2005-09-19T00:00:00' to 2005-09-19. The same
error. Do you know why?


----------------------------------------
From: mike(_at_)saxonica(_dot_)com
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Date: Fri, 18 Dec 2009 10:23:36 +0000
Subject: RE: [xsl] Ways to simplify XSL, complex
"select/filter criteria"

I don't think I fully understand the requirement, but it's
certainly a
case where your code can be simplified by use of functions. For
example you can define this function




select="xs:dateTime($v/ns:startDateTime)"/>

select="xs:dateTime($v/ns:endDateTime)"/>



and this one






and then you can do things like


[exists(ns:validFor[f:applies-now(.)])]"/>

Regards,

Michael Kay
http://www.saxonica.com/
http://twitter.com/michaelhkay

-----Original Message-----
From: Stefan Fritz [mailto:sfritz(_dot_)nospam(_at_)gmx(_dot_)at]
Sent: 18 December 2009 10:07
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] Ways to simplify XSL, complex
"select/filter criteria"
Hi all,

first my environment: Saxon 8.9, XSL and Xpath 2.0, Java

I have to transform a XML document which contains elements
with the
same name but different xs:type.
In addition the elements contain an optional validFor
element which
defines a time period for the validity of the data.

The rules to implement is:
- select element by xsi type
- select the valid (in time period) element
- if no time period specified and multiple elements of the
same type
exist, take the first one

I have to apply these rules in almost every value-of
selection in my
XSLT and therefore the XSLT became really a nightmare.
I hope there is a solution to simplify this. I though about
xsl:function, dynamic Xpath (saxon:evaluate,..) but
couldn't get it
to work.
Any help more than appreciated!

Thanks
Stefan

simplified XML and XSL:


xsi:type="ns:Individual"
xmlns:ns="http://myns";
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>


1800-01-01T00:00:00





2005-09-19T00:00:00



...


...



2010-09-19T00:00:00

email1(_at_)my(_dot_)com



2010-09-19T00:00:00

email2(_at_)my(_dot_)com







xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
xmlns:cdm="http://myns";
xmlns:xs="http://www.w3.org/2001/XMLSchema";
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>




select="/cdm:Individual/cdm:PartyPlays[contains(@xsi:type,'Emp
loyee')][
if(string-length(cdm:validFor/cdm:startDateTime) gt 0 and
string-length(cdm:validFor/cdm:endDateTime) gt 0) then
(xs:dateTime(cdm:validFor/cdm:startDateTime) lt
current-dateTime() and
xs:dateTime(cdm:validFor/cdm:endDateTime)gt
current-dateTime()) else
if(string-length(cdm:validFor/cdm:startDateTime) gt 0) then
(xs:dateTime(cdm:validFor/cdm:startDateTime) lt
current-dateTime()) else
if(string-length(cdm:validFor/cdm:endDateTime) gt 0) then (
xs:dateTime(cdm:validFor/cdm:endDateTime)gt
current-dateTime()) else
1
]/cdm:PartyRoleContactableVia[contains(@xsi:type,'EMailContact')][
if(string-length(cdm:validFor/cdm:startDateTime) gt 0 and
string-length(cdm:validFor/cdm:endDateTime) gt 0) then
(xs:dateTime(cdm:validFor/cdm:startDateTime) lt
current-dateTime() and
xs:dateTime(cdm:validFor/cdm:endDateTime)gt
current-dateTime()) else
if(string-length(cdm:validFor/cdm:startDateTime) gt 0) then
(xs:dateTime(cdm:validFor/cdm:startDateTime) lt
current-dateTime()) else
if(string-length(cdm:validFor/cdm:endDateTime) gt 0) then (
xs:dateTime(cdm:validFor/cdm:endDateTime)gt
current-dateTime()) else
1
][1]/cdm:eMailAddress[1]"/>






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



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

_________________________________________________________________
Hotmail: Trusted email with powerful SPAM protection.
http://clk.atdmt.com/GBL/go/196390707/direct/01/
--~------------------------------------------------------------------
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: --~--


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

_________________________________________________________________
Your E-mail and More On-the-Go. Get Windows Live Hotmail Free.
http://clk.atdmt.com/GBL/go/196390709/direct/01/
--~------------------------------------------------------------------
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>
--~--


--
Gerrit Imsieke
Geschäftsführer / Managing Director
le-tex publishing services GmbH
Weissenfelser Str. 84, 04229 Leipzig, Germany
Phone +49 341 355356 110, Fax +49 341 355356 510
gerrit(_dot_)imsieke(_at_)le-tex(_dot_)de, http://www.le-tex.de

Registergericht / Commercial Register: Amtsgericht Leipzig
Registernummer / Registration Number: HRB 24930

Geschäftsführer: Gerrit Imsieke, Svea Jelonek,
Thomas Schmidt, Dr. Reinhard Vöckler

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