2012-02-23 73 views
1

谷歌轉起來零,所以我在這裏。Java XSLT TransformerException:找不到功能:存在

我正在使用Java中的XSLT。這不是該項目中唯一的XSLT,其他人工作得很好。我的問題如下:

我得到一個javax.xml.transform.TransformerException錯誤信息「找不到函數:存在」。我的XSLT如下:

<?xml version="1.0"?> 
<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xpath="http://www.w3.org/2005/xpath-functions" xmlns:java="java" 
xmlns:url="http://whatever/java/java.net.URLEncoder" 
exclude-result-prefixes="url"> 

    <xsl:template match="User"> 
     <user> 
      <id><xsl:value-of select="id"/></id> 
      <xsl:if test="exists(first)"><first><xsl:value-of select="first"/></first></xsl:if> 
     </user> 
    </xsl:template> 

</xsl:stylesheet> 

的XML輸入以及形成的,如果我刪除<xsl:if test="exists(first)">線,一切正常。

如前所述,我還有其他XSLT可以很好地工作,其中包括一些使用exists函數的XSLT。我檢查了兩者的命名空間,它們是相同的。

任何想法可能會發生什麼?

+0

解決方案可能是'test =「first」'。由於'exists'是XPath 2,難道這種轉換的編程方式與Xalan(XPath 1)不同嗎?如果像Xerces這樣的另一個SPI被遺漏了。 – 2012-02-23 18:52:34

回答

3

我想你可以檢查節點的存在就這樣

<xsl:if test="first"> 
+0

工作很好!而且,我學到了新的東西!謝謝!我的朋友,任何時候都可以使用 – 2012-02-23 18:45:40

+0

。只是將其標記爲正確答案,好嗎? – mindandmedia 2012-02-23 18:48:10

3

存在()是XPath 2.0功能,所以錯誤消息意味着您使用的XSLT 1.0處理器。如果您使用的是Java,那麼沒有理由不繼續使用XSLT 2.0--它將爲您節省大量時間。