我试图在XSLT 1.0中使用java字符串函数。特别是java String替换函数。
但它因空指针异常而失败。这是我试过的:
@Transactional
public void checkInsertion() throws Exception{
try{
jdbcTemplate.update("INSERT INTO TABLE_NAME(COLUMN1, COLUMN2) VALUES( 'A','AF' );
throw new PddaException("custom error");
}catch(Exception ex){
int count=jdbcTemplate.update("ROLLBACK");
log.info("DATA HAS BEEN ROLLBACKED SUCCESSFULLY... "+count);
throw ex;
}
}
但是我一直得到一个空指针异常: 引起:oracle.xdo.parser.v2.XPathException:扩展函数错误:调用'replace'时出错:'java.lang.NullPointerException'
任何人都可以指导我如何使这项工作?
由于
答案 0 :(得分:1)
分析您的XSL代码:
when
中,缺少封闭式代码</xsl:when>
,因此请添加contains($text, '&')
。Name
我认为sample1 & sample2
块的值类似于&
。如果 
后面没有#(例如lt
),则XML解析器隐式查找五个预定义实体名称之一gt
,amp
,{ {1}},quot
和apos
,或任何手动定义的实体名称。因此,在输入XML中,&
必须转义为&
。jString:replace(string, target, replacement)
存在NullPointerException ,如果target或replacement为null(Java.lang.String.replace() Method),那么问题可能就是找不到目标{{{3}} 1}}。
另外,您可以使用&
。对于以下XML:
jString:replaceAll(string, regex, replacement)
使用类似的XSL(例如将<?xml version="1.0"?>
<Payee>
<Name>sample1 & sample2</Name>
</Payee>
替换为&
):
"
结果是:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:jString="http://www.oracle.com/XSL/Transform/java/java.lang.String"
exclude-result-prefixes="jString" version="1.0">
<xsl:output method="xml"/>
<xsl:template name="string-replace-all">
<xsl:param name="text" />
<xsl:choose>
<xsl:when test="contains($text, '&')">
<xsl:variable name="str1" select="jString:new($text)"/>
<xsl:value-of select="jString:replaceAll($str1, '&','"')" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="/">
<Nm>
<xsl:variable name="suppNm">
<xsl:call-template name="string-replace-all">
<xsl:with-param name="text" select="/Payee/Name"/>
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="$suppNm" />
</Nm>
</xsl:template>
</xsl:stylesheet>
主要是重要的输入XML:
<?xml version="1.0" encoding="UTF-8"?>
<Nm>sample1 " sample2</Nm>
发送文字如下:&
然后你应该有错误:<Payee>
<Name>Jüërgëns GmbH & S's</Name>
</Payee>
The entity name must immediately follow the '&' in the entity reference.
中有&
,如下所示:<![CDATA[]]>
然后使用如下的XSL:
<Payee>
<Name><![CDATA[Jüërgëns GmbH & S's]]></Name>
</Payee>
输出如下:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml"/>
<xsl:template match="/">
<Nm>
<xsl:value-of select="/Payee/Name" />
</Nm>
</xsl:template>
</xsl:stylesheet>
希望以上所有注意事项都能为您的案例提供帮助。
答案 1 :(得分:0)
我通过反复试验找到了解决方案。因此,替换&amp; amp;效果很好,同样适用于&amp; amp;不起作用。所以我使用了java String contact函数来实现这个目的:
这是最终的模板:
<xsl:template name="string-replace-all">
<xsl:param name="text" />
<xsl:choose>
<xsl:when test="contains($text, '&') or contains($text, '&') ">
<xsl:variable name="str1" select="jString:new(translate($text,'áàâäéèêëíìîïóòôöúùûüç','aaaaeeeeiiiioooouuuuc'))"/>
<xsl:value-of select="(jString:replaceAll(jString:replaceAll($str1,'&',jString:concat('&','amp;')),'&apos;','&amp;apos;'))" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>