[prev in list] [next in list] [prev in thread] [next in thread] 

List:       xsl-list
Subject:    Re: [xsl] Seek a simple XPath 2.0 expression to return union xs: simpleType containing xs:string
From:       "Michael Kay mike () saxonica ! com" <xsl-list-service () lists ! mulberrytech ! com>
Date:       2015-12-04 15:13:15
Message-ID: 20151204101229.56204 () lists ! mulberrytech ! com
[Download RAW message or body]

Correction:

declare function transitive-members-of-union-type($t) {
     let $m := members-of-union-type($t)
     return $m, $m ! transitive-members-of-union-type(.)
};

MK

> On 4 Dec 2015, at 15:07, Michael Kay mike@saxonica.com \
> <xsl-list-service@lists.mulberrytech.com> wrote: 
> You also need to consider a union type U that has a member type V which is itself a \
> union type with xs:string as a member - that is, you need to consider the \
> transitive membership of the union, not just its direct membership. 
> To do this kind of thing, using XPath directly against the source schema is simply \
> not a suitable strategy. You should be running queries against the schema component \
> model. 
> The following query, which uses Saxon extension functions to access the schema \
> component model, may be helpful: 
> declare function all-union-types() {
> 	saxon:schema("type definition")[.("variety") = "union"]
> };
> 
> declare function members-of-union-type($t) {
> $t("member type definitions")
> };
> 
> declare function transitive-members-of-union-type($t) {
> let $m := members-of-union-type($t)
> return $t, $t ! transitive-members-of-union-type(.)
> };
> 
> declare function union-type-has-transitive-member-type($t, $n as xs:QName) {
> exists ( transitive-members-of-union-type($t) [ .("name") = \
> local-name-from-QName($n) and .("target namespace") = namespace-uri-from-QName($n) \
> ] };
> 
> all-union-types()[ union-type-has-transitive-member-type(., xs:QName('xs:string')) \
> ] ! xs:QName( .("target namespace"), .("name") ) 
> (I've made this output the name of each union type, but it's not clear what you \
> would want to output when the union type is anonymous). 
> 
> Michael Kay
> Saxonica
> 
> 
> > On 4 Dec 2015, at 13:15, Costello, Roger L. costello@mitre.org \
> > <xsl-list-service@lists.mulberrytech.com> wrote: 
> > Hi Folks,
> > 
> > I seek an XPath 2.0 expression that returns all XML Schema simpleTypes containing \
> > a union with memberTypes containing the XML Schema string type. (Phew! Did you \
> > catch all that?) 
> > So, the XPath should return the union simpleType in this schema:
> > 
> > ----------------------------------------------------------------------------------
> >  <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
> > 
> > <xs:simpleType name="test">
> > <xs:union memberTypes="xs:int xs:string" />
> > </xs:simpleType>
> > 
> > </xs:schema>
> > ----------------------------------------------------------------------------------
> >  
> > The XPath should not return the union simpleType in this schema:
> > 
> > ----------------------------------------------------------------------------------
> >  <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
> > 
> > <xs:simpleType name="test">
> > <xs:union memberTypes="xs:int string"/>
> > </xs:simpleType>
> > 
> > <xs:simpleType name="string">
> > <xs:restriction base="xs:string" />
> > </xs:simpleType>
> > 
> > </xs:schema>
> > ----------------------------------------------------------------------------------
> >  
> > I created a horrendously complex XPath 2.0 expression. I think it works (it's so \
> > complex, I'm not sure). Is there a simpler XPath 2.0 expression to solve this \
> > problem? 
> > Here's the ugly XPath 2.0 expression that I created:
> > 
> > //xs:simpleType[xs:union[@memberTypes]
> > [exists(index-of(for $here in ., $i in tokenize(@memberTypes, '\s+') return 
> > namespace-uri-from-QName(resolve-QName($i, $here)) eq
> > 'http://www.w3.org/2001/XMLSchema' and 
> > local-name-from-QName(resolve-QName($i, $here)) eq 'string', true()))]]
> > 
> > /Roger
> > 
> 
--~----------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
EasyUnsubscribe: http://lists.mulberrytech.com/unsub/xsl-list/651070
or by email: xsl-list-unsub@lists.mulberrytech.com
--~--


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic