xslt - Modify element based on subelement's partial value via xsl -


i have follow xml 1.0 code

<oldele userlabel="label1">     <ele1>%02d.jpeg</ele1> </oldele>  <oldele userlabel="label2">     <ele1>%02d.tiff</ele1> </oldele> 

i want change oldele jpeg , tiff each oldele using xsl v1.0. want xsl this:

<jpeg userlabel="label1">     <ele1>%02d.jpeg</ele1> </jpeg>  <tiff userlabel="label2">     <ele1>%02d.tiff</ele1> </tiff> 

i have tried following not working:

<xsl:template match="/oldele">     <xsl:for-each select="/oldele">     <xsl:if test="contains(/oldele/ele1,'jpeg')">         <jpeg>           <xsl:apply-templates select="@*|node()"/>         </jpeg>           </xsl:if>           </xsl:for-each> </xsl:template> 

thanks!

if can guarentee ele1 element ever contain 1 full-stop, extract file extension using xpath function substring-after, , use xsl:element function create new element name

<xsl:element name="{substring-after(ele1, '.')}"> 

there complexity needed because need convert upper case too, , in xslt1.0 achieved means of cumbersome translate function

<xsl:element     name="{translate(      substring-after(ele1, '.'),       'abcdefghijklmnopqrstuvwxyz',       'abcdefghijklmnopqrstuvwxyz')}"> 

one other thing note matching on /oldele imply oldele root element of xml. can ever have 1 root element in well-formed xml not want.

here full xslt

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform">    <xsl:output method="xml" indent="yes"/>     <xsl:template match="oldele[contains(ele1, '.')]">       <xsl:element name="{translate(substring-after(ele1, '.'), 'abcdefghijklmnopqrstuvwxyz', 'abcdefghijklmnopqrstuvwxyz')}">          <xsl:apply-templates select="@*|node()"/>       </xsl:element>    </xsl:template>     <xsl:template match="@*|node()">       <xsl:copy>          <xsl:apply-templates select="@*|node()"/>       </xsl:copy>    </xsl:template> </xsl:stylesheet> 

when applied following xml

<root>    <oldele userlabel="label1">       <ele1>%02d.jpeg</ele1>    </oldele>    <oldele userlabel="label2">       <ele1>%02d.tiff</ele1>    </oldele> </root> 

the following output

<root>    <jpeg userlabel="label1">       <ele1>%02d.jpeg</ele1>    </jpeg>    <tiff userlabel="label2">       <ele1>%02d.tiff</ele1>    </tiff> </root> 

the xslt fail though if ele1 contained more 1 full stop though. example, consider following xml

<root>    <oldele userlabel="label1">       <ele1>test.image1.jpeg</ele1>    </oldele>    <oldele userlabel="label2">       <ele1>test.image2.tiff</ele1>    </oldele> </root> 

in case, in xslt1.0, need recursived named template extract file extenstion.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform">    <xsl:output method="xml" indent="yes"/>     <xsl:template match="oldele[contains(ele1, '.')]">       <xsl:variable name="extension">          <xsl:call-template name="getextension">             <xsl:with-param name="text" select="ele1"/>          </xsl:call-template>       </xsl:variable>        <xsl:element name="{translate($extension, 'abcdefghijklmnopqrstuvwxyz', 'abcdefghijklmnopqrstuvwxyz')}">          <xsl:apply-templates select="@*|node()"/>       </xsl:element>    </xsl:template>     <xsl:template match="@*|node()">       <xsl:copy>          <xsl:apply-templates select="@*|node()"/>       </xsl:copy>    </xsl:template>     <xsl:template name="getextension">       <xsl:param name="text"/>       <xsl:param name="delimiter" select="'.'"/>       <xsl:choose>          <xsl:when test="contains($text, $delimiter)">             <xsl:call-template name="getextension">                <xsl:with-param name="text" select="substring-after($text, $delimiter)"/>                <xsl:with-param name="delimiter" select="$delimiter"/>             </xsl:call-template>          </xsl:when>          <xsl:otherwise>             <xsl:value-of select="$text"/>          </xsl:otherwise>       </xsl:choose>    </xsl:template> </xsl:stylesheet> 

this generate same output.


Comments

Popular posts from this blog

java - Play! framework 2.0: How to display multiple image? -

gmail - Is there any documentation for read-only access to the Google Contacts API? -

php - Controller/JToolBar not working in Joomla 2.5 -