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
Post a Comment