解决在将 XSL 转换与 MobileFirst Adapter 结合使用时出现的非十六进制数字错误
Solve non-hex digit Error while using XSL Transformation With MobileFirst Adapter
- 我的 XML 数据在 xml.
中包含“\”字符
- 当我没有在 Mobilefirst 适配器中使用转换时,它工作正常。
但是当我在 MobielFirst 中通过 xsl 使用转换时,它会抛出如下错误
错误”:[
"non-hex digit on line 4, column 471",
"The returned InvocationResult must be a valid JSON Object."
],
我发现这是由于我的 XML.
中存在的斜杠“\”引起的
相同的 .XSL 代码在除 MobileFirst 之外的其他代码中工作正常如何解决此错误。
当我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>
- 我的 XML 数据在 xml. 中包含“\”字符
- 当我没有在 Mobilefirst 适配器中使用转换时,它工作正常。
但是当我在 MobielFirst 中通过 xsl 使用转换时,它会抛出如下错误
错误”:[ "non-hex digit on line 4, column 471", "The returned InvocationResult must be a valid JSON Object." ],
我发现这是由于我的 XML.
中存在的斜杠“\”引起的
相同的 .XSL 代码在除 MobileFirst 之外的其他代码中工作正常如何解决此错误。
当我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>