2011-05-04 63 views
0

我正在學習XSLT。這些問題可能很明顯,但現在我真的陷入了困境。 氧氣返回以下兩種錯誤:使用XSLT中的功能

  1. 命名空間不申報 'ownFunction()'。 ( 「未聲明的命名空間前綴{} XS」)

  2. 未知的系統功能指數的字符串()
    的XSLT功能index-of-string我從this website了似乎並不被認可

這是XSL文件的簡化版本:

<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"  xmlns:foo="http://www.wathever.com"> 
<xsl:output method="xml" /> 

    <xsl:function name="foo:ownFunction" as="xs:string"> 
    <xsl:param name="string" as="xs:string"/> 

     <xsl:choose> 

      <xsl:when test='contains($string,"src=")'> 
      <xsl:variable name="position"><xsl:value-of select="index-of-string($string,'src=')"/>+<xsl:number value="10"/></xsl:variable> 
      <xsl:variable name="partString"><xsl:value-of select="substring($string,$position)"/></xsl:variable> 
      <xsl:variable name="length"><xsl:value-of select="index-of-string($partString,'quot;')"/> - <xsl:number value="2"/></xsl:variable> 
      <xsl:value-of select="substring($partString,1,$length)"/> 
      </xsl:when> 

      <xsl:otherwise> 
      <xsl:value-of select="hotpot-jmatch-file/data/title"/> 
      </xsl:otherwise> 

     </xsl:choose> 
    </xsl:function> 

    <xsl:template match="/"> 
    <data> 
     <title> 
     <xsl:variable name="string"><xsl:value-of select="hotpot-jmatch-file/data/title"/></xsl:variable> 
     <xsl:value-of select="foo:ownFunction($string)"/> 
     </title> 
    </data> 
    </xsl:template> 
</xsl:stylesheet> 
+0

好問題,+1。詳細解釋這兩個問題及其解決方案,請參閱我的答案。 – 2011-05-04 12:59:01

回答

1

氧氣返回以下錯誤的兩種 :

1)命名空間不申報 'ownFunction()'。 (「未聲明的 名稱空間前綴{xs}」)

這實際上是一個XML問題。任何XSLT樣式表myst都是格式良好的XML文檔。在格式良好的其他要求中,所使用的任何名稱空間前綴都必須綁定到名稱空間聲明中的名稱空間URI。

要糾正此綁定的"xs"前綴"http://www.w3.org/2001/XMLSchema" - 這意味着增加​​一個元素(通常是頂部元素是該命名空間的好選擇

您有"foo:ownFunction"同樣的問題,你必須。有前綴"foo"綁定/定義可見,在使用它之前。只需添加xmlns:foo="my:foo"到您的樣式表的頂部元素。

2)「未知的系統功能 指數的字符串()」。在XSLT的功能 「指數的字符串」我從這個 網站有不似乎 確認: http://www.xsltfunctions.com/xsl/functx_index-of-string.html

你忘了無論是從普麗西拉·沃姆斯利的網站或複製和粘貼功能將其保存在單獨的文件中(推薦),然後使用<xsl:import><xsl:include>將此樣式表文件導入/包含到轉換中。

最後,這些問題表明您需要更系統地引入XSLT。獲得一本好書並閱讀。你不會後悔的。 This answer可能會列出我認爲很好的XSLT和XPath學習資源。

+0

感謝您的解釋!我現在知道了! – user737917 2011-05-04 13:04:13

+0

@ user737917:不客氣。 – 2011-05-04 13:40:51

1

使用

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"  xmlns:foo="http://www.wathever.com" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
exclude-result-prefixes="xs functx"" 
xmlns:functx="http://www.functx.com"> 

<xsl:import href="location-of-functx-library.xsl"/> 

... 

<xsl:value-of select="functx:index-of-string($partString,'quot;')"/> 

樣本定義模式名稱空間並將其綁定到前綴xs,定義鏈接到的函數庫的名稱空間。您還需要下載函數庫實現並將其導入,如圖所示。

+0

好的,這有道理:) – user737917 2011-05-04 12:55:58

+0

非常感謝!我添加了命名空間並導入了該函數並且它可以工作! – user737917 2011-05-04 12:57:45