Re: [xsl] XPath 1.0 challenge: select all XML Schema element declarations with type string

Subject: Re: [xsl] XPath 1.0 challenge: select all XML Schema element declarations with type string
From: "Wendell Piez wapiez@xxxxxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Mon, 27 Jul 2015 12:16:46 -0000
David, this is pretty evil. In a good way.

You've also answered the question I had Friday, namely where the heck is David?

Cheers, Wendell


On Fri, Jul 24, 2015 at 6:07 PM, David Carlisle d.p.carlisle@xxxxxxxxx
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
>>
>> 3. The following two XPath expressions come close to solving the
>> problem. However, sometimes they return an element which should not be
>> returned and sometimes they don't return an element which should be
>> returned.
>>
>> (a) //xs:element[(@type = 'string') or (substring-after(@type, ':') = 'string')]
>>
>> (b) //xs:element[@type= concat(substring-before(name(),'element'),'string')]
>>
>> I must use XPath 1.0.  So which of those two XPath expressions would
>> you recommend I use?
>
> I think you are missing the namespace axis, anyway here are three different
> xpaths that give three different results, take your pick....
>
> (wrapped in XSLT but no XSLT used other than acting as a container for
> the xpath)
>
> ======================
>
> <xs:schema
>     xmlns:xs="http://www.w3.org/2001/XMLSchema";
>     xmlns:xsd="http://www.w3.org/2001/XMLSchema";
>  >
>
>  <xs:element id="a" type="xs:string"/>
>  <xs:element id="b" type="xsd:string"/>
>  <xs:element  xmlns:xsd="http://notXMLSchema";
>           id="c" type="xsd:string"/>
>  <xs:element id="d" type="string"/>
>  <xs:element id="e" type="z:string"/>
>  <xs:element id="f" type=" xs:string "/>
>
> </xs:schema>
>
>
> ===================
>
> <xsl:stylesheet version="1.0"
>         xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
>         xmlns:xs="http://www.w3.org/2001/XMLSchema";
>         >
>
>  <xsl:output indent="yes"/>
>
>  <xsl:template match="/">
>   <x xmlns:xsd="http://www.w3.org/2001/XMLSchema";>
>   <aaaa>
>   <xsl:copy-of select="//xs:element[(@type = 'string') or
> (substring-after(@type, ':') = 'string')]"/>
>   </aaaa>
>
>   <bbbb>
>   <xsl:copy-of select="//xs:element[@type=
> concat(substring-before(name(),'element'),'string')]"/>
>   </bbbb>
>
>   <cccc>
>    <xsl:copy-of select="//xs:element[
>             (normalize-space(@type) = 'string')
>                or
>                (substring-after(normalize-space(@type), ':') = 'string'
>                and
>                namespace::*[.='http://www.w3.org/2001/XMLSchema']
>                [name()=substring-before(normalize-space(../@type), ':')])]"/>
>   </cccc>
>   </x>
>  </xsl:template>
>
>
> ==============
>
> producing
>
>
>    <aaaa>
>       <xs:element id="a" type="xs:string"/>
>       <xs:element id="b" type="xsd:string"/>
>       <xs:element xmlns:xsd="http://notXMLSchema"; id="c" type="xsd:string"/>
>       <xs:element id="d" type="string"/>
>       <xs:element id="e" type="z:string"/>
>    </aaaa>
>    <bbbb>
>       <xs:element id="a" type="xs:string"/>
>    </bbbb>
>    <cccc>
>       <xs:element id="a" type="xs:string"/>
>       <xs:element id="b" type="xsd:string"/>
>       <xs:element id="d" type="string"/>
>       <xs:element id="f" type=" xs:string "/>
>    </cccc>
>
> David
> 



-- 
Wendell Piez | http://www.wendellpiez.com
XML | XSLT | electronic publishing
Eat Your Vegetables
_____oo_________o_o___ooooo____ooooooo_^

Current Thread