Jars2exclude | ![]() |
- Background
- Goal
- Introduction
- Step 1a: Label lib which should be excluded with "2exclude"
- Step 1b Leave exceptions untouched
- Step 2: Copy all elements except those which are labeled "2exclude"
- Help wanted!
- Reference
I wrote 2 XSLT- files that are working fine to exclude jars from lib/*, but I would like to have more "intelligence" (please see below). So consider this a work in progress -- ----
Background
I created a minimal webapp and found the following remark from Geoff Howard in [1] CreateMinimalWebapp - you have to read this reference referenceto understand the context of what we are going to do:\\ Geoff Howard wrote:\\
- 2. edit lib/jars.xml to comment out/remove all the optional jars except the ones noted above\\
- 1. could be done with an xsl transform\\
Goal
You will learn how to write a xsl transform that will remove certain XML-elements. This transform is capable of exceptions.\\
Introduction
There are 2 Steps to do. This steps are achieved by 2 XSLT- files.\\
- Step 1 Label lib which should be excluded with "2exclude", leave exceptions untouched.
- Step 1a Label lib which should be excluded with "2exclude"\\
- Step 1b Leave exceptions untouched\\
- Step 2 Copy all elements except those which are labeled "2exclude"\\
sitemap.snippet:
<map:pipeline> <!-- Step 1: Label lib which should be excluded with "2exclude", leave exceptions untouched. --> <map:match pattern="2Xclude.xml"> <map:generate src="xml/jars.xml"/> <map:transform src="xsl/jars2exclude.xsl"/> <map:serialize type="xml"/> </map:match> <!-- Step 2: Copy all elements except those which are labeled "2exclude"--> <map:match pattern="exclude"> <map:generate src="cocoon:/2Xclude.xml"/> <map:transform src="xsl/exclude2jars.xsl"/> <map:serialize type="xml"/> </map:match> </map:pipeline>
Step 1a: Label lib which should be excluded with "2exclude"
The first xslt (jars2exclude.xsl [2] ) checks the <lib> element form the jars.xml whether it starts with 'optional/' (the dir to exclude files from). If so, they will be labeled "2exclude" (there are exceptions - you will see later).\\ The code looks like this:
<xsl:template match="lib"> <lib> <xsl:choose> <!--==Excluding dir ==--> <xsl:when test="starts-with(text(), 'optional/')"> 2exclude </xsl:when> <!--/==Excluding dir ==--> <xsl:otherwise> <xsl:value-of select="."/> </xsl:otherwise> </xsl:choose> </lib> </xsl:template>
The jars.xml looks like e.g.:\\
... <file> <title>The XML parser</title> <description>Xerces is an XML parser.</description> <used-by>Cocoon</used-by> <lib>core/xercesImpl-2.0.0.jar</lib> <homepage>http://xml.apache.org/xerces-j/</homepage> </file> ...
The example file would not meet the criteria (starts-with(text(), 'optional/')). The following would:
<file> <title>Servlet API</title> <description/> <used-by>Cocoon</used-by> <lib>optional/servlet_2_2.jar</lib> <homepage>http://jakarta.apache.org/tomcat/</homepage> </file>
But this certain file has to be left untouched [1] - this is one of n exceptions (2 are mentioned in [1] , but I need more<-n exception). This will now be explained.
Step 1b Leave exceptions untouched
We introduced one <xsl:choose>. If we nested a little bit deeper we can define exceptions. An exception looks like this:
<xsl:when test="substring-after(text(), 'optional/')='servlet_2_2.jar'"> <xsl:value-of select="."/> </xsl:when>
You can define as many exceptions as you want:
<lib>
<xsl:choose>
<!--==Excluding dir ==-->
<xsl:when test="starts-with(text(), 'optional/')">
<xsl:choose>
<!--==without the exceptions (as many as you want just add a <xsl:when/>==-->
<xsl:when test="substring-after(text(), 'optional/')='fop-0.20.4.jar'">
<xsl:value-of select="."/>
</xsl:when>
<xsl:when test="substring-after(text(), 'optional/')='servlet_2_2.jar'">
<xsl:value-of select="."/>
</xsl:when>
<xsl:when test="substring-after(text(), 'optional/')='commons-jxpath-1.0.jar'">
<xsl:value-of select="."/>
</xsl:when>
<!--/==without the exceptions==-->
<xsl:otherwise>2exclude</xsl:otherwise>
</xsl:choose>
</xsl:when>
<!--/==Excluding dir ==-->
<xsl:otherwise>
<xsl:value-of select="."/>
</xsl:otherwise>
</xsl:choose>
</lib>
The result of the transformation [2] will look like this:
<file> <title>XML Catalog Entity Resolver</title> ... <lib>2exclude</lib> ... </file> <file> <title>Servlet API</title> ... <lib>optional/servlet_2_2.jar</lib> ... </file>
Step 2: Copy all elements except those which are labeled "2exclude"
Transforming this result with exclude2jars.xsl [3] will result in the new jar.xml (without the exclusions, but with the exceptions). We just have to introduce another XPath function\\
<xsl:template match="jars"> <jars> <xsl:copy-of select="file[lib!='2exclude']"/> </jars> </xsl:template>
\\
Help wanted!
Ok, that is nice but I would prefer not to hard code the exceptions, e.g.:\\ substring-after(text(), '__optional/')='__servlet_2_2.jar'\\ hard coded exception e.g. optional/\\ \\ I prefer to use something like jars2exclude.xml [4] where I declare the hard coded exceptions. \\
<jars2exclude> <exclude> <dir2exclude>optional/</dir2exclude> <except>fop-0.20.4.jar</except> <except>commons-jxpath-1.0.jar</except> <except>servlet_2_2.jar</except> </exclude> </jars2exclude>
\\ It would be nice as well to actually delete the files in the lib/*.\\ ..but how can I do that?\\
Any help and any ideas welcome.
King regards\\ Thorsten Scherler
Reference
http://wiki.cocoondev.org/Wiki.jsp?page=CreateMinimalWebapp\\ jars2exclude.xsl:
<xsl:stylesheet version="1.0" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="jars">
<jars>
<xsl:apply-templates select="file"/>
</jars>
</xsl:template>
<xsl:template match="file">
<file>
<xsl:apply-templates/>
</file>
</xsl:template>
<!--================Parsing of value===============================-->
<xsl:template match="title">
<title>
<xsl:value-of select="."/>
</title>
</xsl:template>
<xsl:template match="description">
<description>
<xsl:value-of select="."/>
</description>
</xsl:template>
<xsl:template match="used-by">
<used-by>
<xsl:value-of select="."/>
</used-by>
</xsl:template>
<!--==Excluding dir without the exceptions==-->
<xsl:template match="lib">
<lib>
<xsl:choose>
<!--==Excluding dir ==-->
<xsl:when test="starts-with(text(), 'optional/')">
<xsl:choose>
<!--==without the exceptions==-->
<xsl:when test="substring-after(text(), 'optional/')='fop-0.20.4.jar'">
<xsl:value-of select="."/>
</xsl:when>
<xsl:when test="substring-after(text(), 'optional/')='servlet_2_2.jar'">
<xsl:value-of select="."/>
</xsl:when>
<xsl:when test="substring-after(text(), 'optional/')='commons-jxpath-1.0.jar'">
<xsl:value-of select="."/>
</xsl:when>
<xsl:otherwise>2exclude</xsl:otherwise>
<!--/==without the exceptions==-->
</xsl:choose>
</xsl:when>
<!--/==Excluding dir ==-->
<xsl:otherwise>
<xsl:value-of select="."/>
</xsl:otherwise>
</xsl:choose>
</lib>
</xsl:template>
<xsl:template match="homepage">
<homepage>
<xsl:value-of select="."/>
</homepage>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <xsl:apply-templates/> </xsl:template> <xsl:template match="jars"> <xsl:comment> Add an entry for each jar file used by Cocoon, following the other entries Author: Ovidiu Predescu "ovidiu@cup.hp.com" Date: May 23, 2002 jars2exclude have been used. Author: Thorsten Scherler "thorsten.scherler@wyona.org" Date: March 06, 2003 This is the modified jars.xml. </xsl:comment> <jars> <xsl:copy-of select="file[lib!='2exclude']"/> </jars> </xsl:template> </xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?> <!-- Add an entry for each jar file which should be excluded by Cocoon! Author: Thorsten Scherler "thorsten.scherler@wyona.org" Date: March 05, 2003 --> <jars2exclude> <exclude> <dir2exclude>optional/</dir2exclude> <except>fop-0.20.4.jar</except> <except>commons-jxpath-1.0.jar</except> <except>servlet_2_2.jar</except> </exclude> </jars2exclude>
<map:pipeline> <!-- Step 1: Label lib which should be excluded with "2exclude", leave exceptions untouched. --> <map:match pattern="2Xclude.xml"> <map:generate src="xml/jars.xml"/> <map:transform src="xsl/jars2exclude.xsl"/> <map:serialize type="xml"/> </map:match> <!-- Step 2: Copy all elements except those which are labeled "2exclude"--> <map:match pattern="exclude"> <map:generate src="cocoon:/2Xclude.xml"/> <map:transform src="xsl/exclude2jars.xsl"/> <map:serialize type="xml"/> </map:match> </map:pipeline>


