在xslt中使用java字符串函数
我正在尝试将java字符串函数与XSLT1.0结合使用。特别是java字符串替换函数 但它失败,出现空指针异常。以下是我尝试过的:在xslt中使用java字符串函数,java,string,xslt,Java,String,Xslt,我正在尝试将java字符串函数与XSLT1.0结合使用。特别是java字符串替换函数 但它失败,出现空指针异常。以下是我尝试过的: 1)--Declare namespace and call the java String class <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:jString="http://www.oracle.com/XSL/Transf
1)--Declare namespace and call the java String class
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:jString="http://www.oracle.com/XSL/Transform/java/java.lang.String">
2)--Created a template to search for tag inputs that have an ampersand:
<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:replace($str1,'&','&')" />
<xsl:otherwise>
<xsl:value-of select="$text" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
3)--Call the template in the specific tags
<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>
但是,我不断得到一个空指针异常:
原因:oracle.xdo.parser.v2.XPathException:扩展函数错误:调用“replace”时出错:“java.lang.NullPointerException”
有人能指导我如何做这件事吗
感谢您分析XSL代码: 在模板字符串替换所有缺少闭合标记时,请添加。 没有表示输入XML,因此没有人知道Payee/Name中的值。看看这个部分包含$text,“&”我想Name块的值类似于sample1和sample2。如果后面不跟&160;,则;,XML解析器隐式地查找五个预定义的实体名称lt、gt、amp、quot和apos中的一个,或者任何手动定义的实体名称。因此,在输入XML中,&必须作为&;转义;。 在使用jString:replacestring、target、replacementNullPointerException的情况下,如果target或replacement为null,则会存在异常,所以问题可能是由于&,未拾取target。 对于替换,您还可以使用jString:replaceAllstring、regex、replacement。 最后一个在xslt中使用java字符串函数的示例: 对于以下XML:
<?xml version="1.0"?>
<Payee>
<Name>sample1 & sample2</Name>
</Payee>
结果是:
<?xml version="1.0" encoding="UTF-8"?>
<Nm>sample1 " sample2</Nm>
那么您应该有错误:实体名称必须紧跟实体引用中的“&”
如果您有以下信息(&N):
然后使用XSL,如下所示:
<?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>
<?xml version="1.0" encoding="UTF-8"?>
<Nm>Jüërgëns GmbH & S's</Nm>
输出如下:
<?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>
<?xml version="1.0" encoding="UTF-8"?>
<Nm>Jüërgëns GmbH & S's</Nm>
希望以上所有注意事项都能对您的案例有所帮助。我通过反复试验找到了解决方案。那么,谁来代替&apos;效果很好,对于&;不起作用。因此,我使用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>
可能重复的&本身不是合法的XML。我很惊讶您的XSLT竟然被加载了。从XSLT调用Java完全取决于您使用的XSLT处理器。我从错误消息中怀疑是Oracle处理器,但您需要告诉我们。为什么不切换到XSLT 2.0/3.0,其中XPath以本机方式提供基于正则表达式的字符串替换?您好,非常感谢您耐心地回答我的问题。我需要带着&;逃离安培;。但无论我尝试什么,输出都是&。我尝试了1个jString:replaceAll$str1、&;和&;amp;'和jString:replaceAll$str1、“&;”、”&38;'. 有人能帮我吗?这是我需要弄清楚的一点谜题。我们正在使用XSLT1。0@springblossom您能将您的输入XML添加到问题中吗?您好,输入XML是供应商名称,Jüërgëns GmbH&S的我需要替换为&;和“带&apos;”;。用&apos;正在工作,但我没有成功地用&;替换;。非常感谢您的帮助。@SpringBloom如何在输入XML中解析此数据非常重要,请参阅我在回答中添加的第5页。您好,我无法使用CDATA,因为我需要将两个特殊字符&和“同时转换为&;和&apos;。我需要展示&as&;使用Java替换所有函数。欢迎任何意见
<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>