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?