解决在将 XSL 转换与 MobileFirst Adapter 结合使用时出现的非十六进制数字错误

Solve non-hex digit Error while using XSL Transformation With MobileFirst Adapter

  1. 我的 XML 数据在 xml.
  2. 中包含“\”字符
  3. 当我没有在 Mobilefirst 适配器中使用转换时,它工作正常。
  4. 但是当我在 MobielFirst 中通过 xsl 使用转换时,它会抛出如下错误

    错误”:[ "non-hex digit on line 4, column 471", "The returned InvocationResult must be a valid JSON Object." ],

  5. 我发现这是由于我的 XML.

  6. 中存在的斜杠“\”引起的
  7. 相同的 .XSL 代码在除 MobileFirst 之外的其他代码中工作正常如何解决此错误。

  8. 当我remove/comment"DESCRIPTION"<xsl:value-of select="DESCRIPTION" />它工作正常。

XML

<?xml version="1.0" encoding="UTF-8" ?>
    <Envelope>
        <Body>
            <QueryResponse>
                <CLASSIFICATIONSSet>
                    <CLASSSTRUCTURE>
                        <CLASSIFICATIONID>Kawin</CLASSIFICATIONID>
                        <CLASSSTRUCTUREID>1001</CLASSSTRUCTUREID>
                        <CLASSUSEWITH>
                            <OBJECTNAME>1</OBJECTNAME>
                        </CLASSUSEWITH>
                        <CLASSUSEWITH>
                            <OBJECTNAME>2</OBJECTNAME>
                        </CLASSUSEWITH>
                        <CLASSUSEWITH>
                            <OBJECTNAME>3</OBJECTNAME>
                        </CLASSUSEWITH>
                        <CLASSUSEWITH>
                            <OBJECTNAME>4</OBJECTNAME>
                        </CLASSUSEWITH>
                        <DESCRIPTION>End User Issue \ Telco</DESCRIPTION>
                        <HIERARCHYPATH>Good \ BAD</HIERARCHYPATH>
                        <OBJECTNAME>1</OBJECTNAME>
                    </CLASSSTRUCTURE>
                </CLASSIFICATIONSSet>
            </QueryResponse>
        </Body>
    </Envelope>

XSL

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:h="http://www.w3.org/1999/xhtml"
               >
    <xsl:output method="text"/>

    <xsl:template match="/">
        {


                'ClassificationData': [
                    <xsl:for-each select="*//CLASSSTRUCTURE">


                                    {
                                        "CLASSSTRUCTUREID" : '<xsl:value-of select="CLASSSTRUCTUREID" />', 
                                        "DESCRIPTION" : '<xsl:value-of select="DESCRIPTION" />' ,
                                        "CLASSIFICATIONID" : '<xsl:value-of select="CLASSIFICATIONID" />',
                                        "OBJECTNAME" : '<xsl:value-of select="OBJECTNAME" />',

                                         "CLASSUSEWITH" : [

                                            <xsl:for-each select="CLASSUSEWITH">
                                             {
                                                    "OBJECTNAME" : "<xsl:value-of select="OBJECTNAME" />"
                                             } ,
                                            </xsl:for-each>
                                        ]
                                    },
                       </xsl:for-each>
                    ]
      </xsl:choose>
        }
    </xsl:template>
</xsl:stylesheet>

最后,我通过将“\”反斜杠替换为“\\”双反斜杠和双斜杠开头和结尾的 space,使适配器正常工作。

XSL

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:h="http://www.w3.org/1999/xhtml">
    <xsl:output method="text"  encoding="ISO-8859-1" indent="yes"/>
    <xsl:template match="/">
        {

                'ClassificationData': [

        <xsl:for-each select="*//CLASSSTRUCTURE">


                                    {
                                         "CLASSSTRUCTUREID" : '
            <xsl:value-of select="CLASSSTRUCTUREID" />', 


            <xsl:variable name="DESC">
                <xsl:value-of select='DESCRIPTION' />
            </xsl:variable>
            <xsl:variable name="repString">
                <xsl:call-template name="string-replace">
                    <xsl:with-param name="haystack" select="$DESC" />
                    <xsl:with-param name="search" select="'\'" />
                    <xsl:with-param name="replace" select="' \ '" />
                </xsl:call-template>
            </xsl:variable>


                                        "DESCRIPTION" : "
            <xsl:value-of select='$repString'/>" , 
                                        "CLASSIFICATIONID" : '
            <xsl:value-of select="CLASSIFICATIONID" />',
                                        "OBJECTNAME" : '
            <xsl:value-of select="OBJECTNAME" />', 

                                         "CLASSUSEWITH" : [


            <xsl:for-each select="CLASSUSEWITH">
                                             {
                                                    "OBJECTNAME" : "
                <xsl:value-of select="OBJECTNAME" />"
                                             } ,

            </xsl:for-each>
                                        ]
                                    },

        </xsl:for-each>

                    ]



        }

    </xsl:template>
    <xsl:template name="string-replace">
        <xsl:param name="haystack" />
        <xsl:param name="search" />
        <xsl:param name="replace" select="''" />
        <xsl:choose>
            <xsl:when test="contains($haystack, $search)">
                <xsl:value-of select="substring-before($haystack, $search)" />
                <xsl:value-of select="$replace" />
                <xsl:call-template name="string-replace">
                    <xsl:with-param name="haystack" select="substring-after($haystack, $search)" />
                    <xsl:with-param name="search" select="$search" />
                    <xsl:with-param name="replace" select="$replace" />
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$haystack" />
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>