Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <!-- Generates JSON data from ABAP data, see my blog:
- http://ruediger-plantiko.blogspot.com/2011/09/ein-json-builder-in-abap.html -->
- <xsl:transform version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- xmlns:sap="http://www.sap.com/sapxsl"
- xmlns:asx="http://www.sap.com/abapxml">
- <xsl:strip-space elements="*"/>
- <xsl:template match="/">
- <xsl:apply-templates select="/asx:abap/asx:values"/>
- </xsl:template>
- <xsl:template match="DATA_ROOT">
- <xsl:call-template name="getData"/>
- </xsl:template>
- <xsl:template name="getData">
- <asx:abap>
- <asx:values>
- <JSON>
- <xsl:call-template name="showData">
- <xsl:with-param name="data" select="."/>
- </xsl:call-template>
- </JSON>
- </asx:values>
- </asx:abap>
- </xsl:template>
- <xsl:template name="showData">
- <xsl:param name="data"/>
- <xsl:variable name="type" select="$data/TYPE"/>
- <xsl:for-each select="$data/DATA">
- <xsl:choose>
- <xsl:when test="$type = 'N'">
- <xsl:call-template name="simpleValue"/>
- </xsl:when>
- <xsl:when test="$type = 'S'">
- <xsl:call-template name="stringValue"/>
- </xsl:when>
- <xsl:when test="$type = 'B'">
- <xsl:call-template name="booleanValue"/>
- </xsl:when>
- <xsl:when test="$type = 'h'">
- <xsl:call-template name="showHash"/>
- </xsl:when>
- <xsl:when test="$type = 'a'">
- <xsl:call-template name="showArray"/>
- </xsl:when>
- </xsl:choose>
- </xsl:for-each>
- </xsl:template>
- <xsl:template name="showHash">
- <xsl:variable name="id" select="substring(@href,2)"/>
- <xsl:text>{</xsl:text>
- <xsl:for-each select="/asx:abap/asx:heap/*[@id = $id]/*">
- <xsl:if test="position() > 1">,</xsl:if>
- <xsl:call-template name="showHashRow"/>
- </xsl:for-each>
- <xsl:text>}</xsl:text>
- </xsl:template>
- <xsl:template name="showHashRow">
- <xsl:text>"</xsl:text><xsl:value-of select="KEY"/><xsl:text>":</xsl:text>
- <xsl:call-template name="showData">
- <xsl:with-param name="data" select="."/>
- </xsl:call-template>
- </xsl:template>
- <xsl:template name="showArray">
- <xsl:variable name="id" select="substring(@href,2)"/>
- <xsl:text>[</xsl:text>
- <xsl:for-each select="/asx:abap/asx:heap/*[@id = $id]/*">
- <xsl:if test="position() > 1">,</xsl:if>
- <xsl:call-template name="showData">
- <xsl:with-param name="data" select="."/>
- </xsl:call-template>
- </xsl:for-each>
- <xsl:text>]</xsl:text>
- </xsl:template>
- <xsl:template name="stringValue">
- <xsl:text>"</xsl:text><xsl:call-template name="string-replace-all">
- <xsl:with-param name="text">
- <xsl:call-template name="string-replace-all">
- <xsl:with-param name="text">
- <xsl:call-template name="simpleValue"/>
- </xsl:with-param>
- <xsl:with-param name="replace">\</xsl:with-param>
- <xsl:with-param name="by">\\</xsl:with-param>
- </xsl:call-template>
- </xsl:with-param>
- <xsl:with-param name="replace">"</xsl:with-param>
- <xsl:with-param name="by">\"</xsl:with-param>
- </xsl:call-template><xsl:text>"</xsl:text>
- </xsl:template>
- <xsl:template name="simpleValue">
- <xsl:choose>
- <xsl:when test="@href">
- <xsl:call-template name="getReference">
- <xsl:with-param name="href" select="./@href"/>
- </xsl:call-template>
- </xsl:when>
- <xsl:otherwise><xsl:value-of select="."/></xsl:otherwise>
- </xsl:choose>
- </xsl:template>
- <xsl:template name="booleanValue">
- <xsl:variable name="value">
- <xsl:call-template name="simpleValue"/>
- </xsl:variable>
- <xsl:choose>
- <xsl:when test="contains( $value, 'X')">true</xsl:when>
- <xsl:otherwise>false</xsl:otherwise>
- </xsl:choose>
- </xsl:template>
- <xsl:template name="getReference">
- <xsl:param name="href"/>
- <xsl:value-of select="/asx:abap/asx:heap/*[@id = substring($href,2)]"/>
- </xsl:template>
- <!-- Template dankend übernommen aus http://geekswithblogs.net/Erik/archive/2008/04/01/120915.aspx -->
- <xsl:template name="string-replace-all">
- <xsl:param name="text" />
- <xsl:param name="replace" />
- <xsl:param name="by"/>
- <xsl:choose>
- <xsl:when test="contains($text, $replace)">
- <xsl:value-of select="substring-before($text,$replace)" />
- <xsl:value-of select="$by" />
- <xsl:call-template name="string-replace-all">
- <xsl:with-param name="text"
- select="substring-after($text,$replace)" />
- <xsl:with-param name="replace" select="$replace" />
- <xsl:with-param name="by" select="$by" />
- </xsl:call-template>
- </xsl:when>
- <xsl:otherwise>
- <xsl:value-of select="$text" />
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
- </xsl:transform>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement