2017-12-27 277 views
0

我想在XSLT 1.0中使用java字符串函數。具體來說就是java String替換函數。在xslt中使用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:擴展功能錯誤:錯誤調用「取代」:'java.lang中。 NullPointerException'

任何人都可以指導我如何使這項工作?

感謝

+1

的可能的複製[?什麼是空指針異常,以及如何解決呢(https://開頭計算器.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) – Ivan

+0

'&'本身不是合法的XML。我很驚訝你的XSLT被加載了。 – VGR

+0

從XSLT到Java的調用完全取決於您使用的是哪個XSLT處理器。我從錯誤信息中懷疑這是Oracle處理器,但您需要告訴我們。爲什麼不切換到XPath本地提供基於正則表達式的字符串替換的XSLT 2.0/3.0? –

回答

0

分析您的XSL代碼:

  1. 在模板string-replace-all有沒有封閉標籤when的,所以加</xsl:when>
  2. 輸入XML未被顯示,因此沒有人知道收款人/姓名中的值。看這部分contains($text, '&')我想Name塊有價值像sample1 & sample2。在的情況下&其後面沒有#(例如&#160;),XML解析器被隱含找五個預定義實體名稱ltgtampquotapos,或者任何手動定義實體名稱中的一個。所以在輸入XML中,&必須轉義爲&amp;
  3. 如果當您使用jString:replace(string, target, replacement)NullPointerException異常存在,如果目標或更換爲空(Java.lang.String.replace() Method),因此可能問題是目標沒有拿起原因&。 同樣替換你可以使用jString:replaceAll(string, regex, replacement)
  4. 最後示例在XSLT用java字符串功能:

對於下面的XML:

<?xml version="1.0"?> 
<Payee> 
    <Name>sample1 &amp; sample2</Name> 
</Payee> 

使用類似於XSL(例如與&quot;)替換&amp;

<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> 

結果是:

<?xml version="1.0" encoding="UTF-8"?> 
<Nm>sample1 " sample2</Nm> 
  • 主要重要輸入XML:

    • 如果它簡單的文本與&如下:
    <Payee> 
        <Name>Jüërgëns GmbH & S's</Name> 
    </Payee> 
    
  • 那麼你應該有錯誤:The entity name must immediately follow the '&' in the entity reference.

    • 如果你有如下&<![CDATA[]]>
    <Payee> 
        <Name><![CDATA[Jüërgëns GmbH & S's]]></Name> 
    </Payee> 
    

    然後使用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> 
    

    希望所有關注上方將與您的情況有所幫助。

    +0

    嗨非常感謝您的耐心回答我的問題。我需要用&來避開&符。但是不管我嘗試輸出什麼都是&。我試過1)jString:replaceAll($ str1,'&','& amp;')和jString:replaceAll($ str1 ,,'&','&')。任何人都可以幫助我嗎?這是我需要弄清的難題。我們正在使用XSLT 1.0 – springblossom

    +0

    @springblossom你可以添加輸入XML來提問嗎? –

    +0

    嗨輸入XML是供應商名稱,JüërgënsGmbH&S的 我需要用&和'與'替換。 '與'替換'正在工作,但我還沒有成功取代&&。任何幫助表示讚賞。 – springblossom

    0

    我通過試錯找到了解決方案。那麼哪個替換爲&?效果很好,同樣適用於& amp;不起作用。所以我用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>