<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:dp="http://www.datapower.com/extensions"
  extension-element-prefixes="dp"
  xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx"
>
  <xsl:template match="/response">
    <xsl:text>{ </xsl:text>
      <xsl:value-of select="concat('&quot;', name(), '&quot;', ':{ ')"/>
        <xsl:apply-templates select="ver" mode="number"/>

        <xsl:text>, </xsl:text>
        <xsl:apply-templates select="source" mode="number"/>

        <xsl:text>, </xsl:text>
        <xsl:value-of select="concat('&quot;data&quot;', ':[ ')"/>
          <xsl:apply-templates select="data"/>
        <xsl:text> ]</xsl:text>
      <xsl:text> }</xsl:text>
    <xsl:text> }</xsl:text>
  </xsl:template>
  
  <xsl:template match="data">
    <xsl:text>{ </xsl:text>
      <xsl:apply-templates select="table" mode="number"/>

      <xsl:text>, </xsl:text>
      <xsl:apply-templates select="batch" mode="string"/>
    <xsl:text> }</xsl:text>

    <xsl:if test="position() != last()">
      <xsl:text>, </xsl:text>
    </xsl:if>
  </xsl:template>
  
  <xsl:template match="*" mode="number">
    <xsl:value-of select="concat('&quot;', name(), '&quot;', ':', normalize-space())"/>
  </xsl:template>
  
  <xsl:template match="*" mode="string">
    <xsl:value-of select="concat('&quot;', name(), '&quot;', ':&quot;', dp:encode(., 'json-escape'), '&quot;')"/>
  </xsl:template>
</xsl:stylesheet>