Hello,
I want to transform XML into HTML using groovy and XSL file. I use javax.xml.transform library for this. But when I try run groovy script inside and outside soapUI it it gives me diffrent responses.
Here are my test files:
<?xml version="1.0" encoding="UTF-8"?><apis><api min="" max="2.0"><resource name="A"><description>A from beggining to 2.0</description></resource></api><api min="2.0" max="2.0.1"><resource name="A"><description>A from 2.0 to 2.0.1</description></resource></api><api min="2.0.1" max=""><resource name="A"><description>A from 2.0.1 to now</description></resource></api></apis>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xslaram name="api-version" select="2.0"/><xsl:template match="/apis"><html><head/><body><table border="1"><th colspan="2"><xsl:text>Doc for API: </xsl:text><xsl:value-of select="$api-version"/></th><xsl:apply-templates select="api[(@min='' or @min <= $api-version) and (@max='' or @max > $api-version)]/resource"><xsl:sort select="@name"/></xsl:apply-templates></table></body></html></xsl:template><xsl:template match="resource"><tr><td><xsl:value-of select="@name"/></td><td><xsl:value-of select="description"/></td></tr></xsl:template></xsl:stylesheet>
import javax.xml.transform.TransformerFactory
import javax.xml.transform.stream.StreamResult
import javax.xml.transform.stream.StreamSource
def workspacePath
def xslPath
def xslFileName
def xmlPath
def xmlFileName
def outputPath
def outputFileName
def xslt
def transformer
def xml
def html
def apiVersions
//define workspace
workspacePath = "C:/test/"
//define xls location
xslPath = "transformations/"
//define xsl file name
xslFileName = "test4.xsl"
//define source xml location
xmlPath = "pendingFeature/"
//define xml file name
xmlFileName = "test4.xml"
//define output path
outputPath = "outputs/"
//define api version
apiVersions = ['1.0','2.0','2.0.1']
// load xslt
xslt = new File(workspacePath + xslPath + xslFileName).getText()
// create transformer
transformer = TransformerFactory.newInstance().newTransformer(new StreamSource(new StringReader(xslt)))
// load xml
xml = new File(workspacePath + xmlPath + xmlFileName).getText()
apiVersions.each { apiVersion ->
//define output file name
outputFileName = "doc for " + apiVersion + " api version.html"
// set output file
html = new FileOutputStream(workspacePath + outputPath + outputFileName)
// set api version
transformer.setParameter("api-version", apiVersion)
// perform transformation
transformer.transform(new StreamSource(new StringReader(xml)), new StreamResult(html))
//close stream
html.close()
}For API version 1.0 it is ok, but for 2.0 and higher there is a problem while running script outside soapUI with finding matching api node with expresion
(@min='' or @min <= $api-version) and (@max='' or @max > $api-version)
I think it is because in XPath 1.0 the < and > operators always do numeric comparison and 2.0 doesn't. But I declare in XSL files xsl:stylesheet version="2.0" so is should use XPath 2.0 in both places and work. W3schools says:
"XSLT 2.0, XPath 2.0, and XQuery 1.0, share the same functions library. There are over 100 built-in functions. There are functions for string values, numeric values, date and time comparison, node and QName manipulation, sequence manipulation, Boolean values, and more."
Why in soapUI it works?
aram name="api-version" select="2.0"/><xsl:template match="/apis"><html><head/><body><table border="1"><th colspan="2"><xsl:text>Doc for API: </xsl:text><xsl:value-of select="$api-version"/></th><xsl:apply-templates select="api[(@min='' or @min <= $api-version) and (@max='' or @max > $api-version)]/resource"><xsl:sort select="@name"/></xsl:apply-templates></table></body></html></xsl:template><xsl:template match="resource"><tr><td><xsl:value-of select="@name"/></td><td><xsl:value-of select="description"/></td></tr></xsl:template></xsl:stylesheet>