xsl-list
[Top] [All Lists]

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

2015-07-24 17:07:09

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
--~----------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
EasyUnsubscribe: http://lists.mulberrytech.com/unsub/xsl-list/1167547
or by email: xsl-list-unsub(_at_)lists(_dot_)mulberrytech(_dot_)com
--~--

<Prev in Thread] Current Thread [Next in Thread>