2011-05-04 43 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