xslt - xsl template with match that compares dates -


i have following xml

<list>   <field name="d22" value="2005-05-03z" />   <element name="qx55">     <element name="qx553" value="2004-01-01z" />   </element>   <element name="qx55">     <element name="qx553" value="2005-04-26z" />   </element>   <element name="qx55">     <element name="qx553" value="2005-05-01z" />   </element>   <element name="qx55">     <element name="qx553" value="2006-01-01z" />   </element>   <element name="qx55">     <element name="qx553" value="2005-05-03z" />   </element> </list> 

i trying create xslt mapping remove qx25 elements @value date before date in @value field d22

i applying filter using element:

<xsl:template match=""> 

i know xslt cannot compare dates suspect have done substring don't know how apply substring in match attribute. cannot use extensions xslt

this tried far: tried working comparing years far it's giving me parse exception

<xsl:variable name="d22date">         <xsl:value-of select="/list/field[@name='d22']/@value" /> </xsl:variable>  <xsl:template match="//element[@name='qx55'][element[@name='qx553' , substring(@value,0,5)<substring($d22date,0,5)]]"/> 

can me match attribute?

i using xslt 2.0

you not far off, there few things wrong current attempt:

  • < needs escaped &lt; in expression
  • indexing of characters in substring starts @ 1, not 0.
  • the length of date string want 10, not 5

this means template should this:

<xsl:template match="element                      [@name='qx55']                      [element[@name='qx553' , substring(@value, 1, 10) &lt; substring($d22date, 1, 10)]]"/> 

note not true xslt can't compare dates. xslt 2.0 have many date/time functions. example, write xslt this

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="2.0" xmlns:xs="http://www.w3.org/2001/xmlschema">     <xsl:output method="xml" indent="yes" />      <xsl:variable name="d22date" select="/list/field[@name='d22']/@value" as="xs:date" />      <xsl:template match="element[@name='qx55'][element[@name='qx553' , xs:date(@value) &lt; $d22date]]"/>      <xsl:template match="@*|node()">         <xsl:copy>             <xsl:apply-templates select="@*|node()"/>         </xsl:copy>     </xsl:template> </xsl:stylesheet> 

Comments

Popular posts from this blog

angularjs - ADAL JS Angular- WebAPI add a new role claim to the token -

php - CakePHP HttpSockets send array of paramms -

node.js - Using Node without global install -