0
  1. 我的 XML 数据在 xml 中包含“\”字符。
  2. 当我没有在 Mobilefirst Adapter 中使用 Transformation 时,它工作得很好。
  3. 但是当我在 MobielFirst 中通过 xsl 使用 Transformation 时,它会抛出如下错误

    errors": [ "non-hex digit on line 4, column 471", "返回的 InvocationResult 必须是有效的 JSON 对象。" ],

  4. 我发现它是由我的 XML 中的斜杠“\”引起的。

  5. 除了在 MobileFirst 中如何解决此错误之外,相同的 .XSL 代码在其他人中也可以正常工作。

  6. 当我删除/评论“描述”<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>
4

1 回答 1

1

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

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>
于 2015-03-25T09:59:03.047 回答