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_^
|