Subject: Re: [xsl] Seek a simple XPath 2.0 expression to return union xs: simpleType containing xs:string From: "Michael Kay mike@xxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Fri, 4 Dec 2015 15:12:30 -0000 |
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@xxxxxxxxxxxx <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> 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@xxxxxxxxx <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> 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
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Seek a simple XPath 2.0 e, Michael Kay mike@xxx | Thread | [xsl] Having trouble with key() fun, Marvin NotMyRealName |
Re: [xsl] Seek a simple XPath 2.0 e, Michael Kay mike@xxx | Date | [xsl] Having trouble with key() fun, Marvin NotMyRealName |
Month |