在xslt中使用java String函数

时间:2017-12-27 14:30:53

标签: java string xslt

我试图在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'

任何人都可以指导我如何使这项工作?

由于

2 个答案:

答案 0 :(得分:1)

分析您的XSL代码:

  1. 在模板when中,缺少封闭式代码</xsl:when>,因此请添加contains($text, '&')
  2. 未显示输入XML,因此没有人知道收款人/姓名中的值。查看此部分Name我认为sample1 & sample2块的值类似于&。如果&#160;后面没有#(例如lt),则XML解析器隐式查找五个预定义实体名称之一gtamp,{ {1}},quotapos,或任何手动定义的实体名称。因此,在输入XML中,&必须转义为&amp;
  3. 如果您使用jString:replace(string, target, replacement) 存在NullPointerException ,如果target或replacement为null(Java.lang.String.replace() Method),那么问题可能就是找不到目标{{{3}} 1}}。 另外,您可以使用&
  4. 进行替换
  5. 最后示例在xslt中使用java字符串函数
  6. 对于以下XML:

    jString:replaceAll(string, regex, replacement)

    使用类似的XSL(例如将<?xml version="1.0"?> <Payee> <Name>sample1 &amp; sample2</Name> </Payee> 替换为&amp;):

    &quot;

    结果是:

    <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, '&amp;')"> 
                 <xsl:variable name="str1" select="jString:new($text)"/>                 
                 <xsl:value-of select="jString:replaceAll($str1, '&amp;','&quot;')" />
              </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>
    
    1. 主要是重要的输入XML:

      • 如果您只是使用<?xml version="1.0" encoding="UTF-8"?> <Nm>sample1 " sample2</Nm> 发送文字如下:
      &
    2. 然后你应该有错误:<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, '&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>