在xslt中使用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

我正在尝试将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/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,'&','&amp;')" /> 
       <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 &amp; 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 &amp; 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 &amp; S's</Nm>

希望以上所有注意事项都能对您的案例有所帮助。

我通过反复试验找到了解决方案。那么,谁来代替&apos;效果很好,对于&;不起作用。因此,我使用java String contact函数来实现这一点:

以下是最终模板:

 <xsl:template name="string-replace-all">
        <xsl:param name="text" />
        <xsl:choose>
           <xsl:when test="contains($text, '&amp;') or contains($text, '&amp;') ">
               <xsl:variable name="str1" select="jString:new(translate($text,'áàâäéèêëíìîïóòôöúùûüç','aaaaeeeeiiiioooouuuuc'))"/> 
                <xsl:value-of select="(jString:replaceAll(jString:replaceAll($str1,'&amp;',jString:concat('&amp;','amp;')),'&amp;apos;','&amp;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, '&amp;') or contains($text, '&amp;') ">
               <xsl:variable name="str1" select="jString:new(translate($text,'áàâäéèêëíìîïóòôöúùûüç','aaaaeeeeiiiioooouuuuc'))"/> 
                <xsl:value-of select="(jString:replaceAll(jString:replaceAll($str1,'&amp;',jString:concat('&amp;','amp;')),'&amp;apos;','&amp;amp;apos;'))" />

               </xsl:when>
           <xsl:otherwise>
              <xsl:value-of select="$text" />
           </xsl:otherwise>
           </xsl:choose>

     </xsl:template>