4

我正在学习 XSLT。这些问题可能很明显,但我现在真的被困住了。Oxygen 返回以下两种错误:

  1. 没有为“ownFunction()”声明命名空间。("未声明的命名空间前缀 {xs}")

  2. 未知系统函数 index-of-string()
    index-of-string我从这个网站获得的 XSLT 功能似乎无法识别

这是 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>
4

2 回答 2

5

Oxygen 返回以下两种错误:

1) 没有为 'ownFunction()' 声明命名空间。("未声明的命名空间前缀 {xs}")

这实际上是一个 XML 问题。任何 XSLT 样式表都可能是格式良好的 XML 文档。除了格式良好的其他要求之外,使用的任何命名空间前缀都必须绑定到命名空间声明中的命名空间 URI。

要更正此绑定"xs"前缀到"http://www.w3.org/2001/XMLSchema"-- 这意味着添加xmlns:xs="http://www.w3.org/2001/XMLSchema"到元素(通常顶部元素是此命名空间的不错选择。

你有同样的问题"foo:ownFunction"。在使用它之前,您必须具有"foo"绑定/定义和可见的前缀。只需添加xmlns:foo="my:foo"到样式表的顶部元素。

2) “未知系统函数 index-of-string()”。我从该网站获得的 XSLT 函数“字符串索引”似乎无法识别: http ://www.xsltfunctions.com/xsl/functx_index-of-string.html

您忘记从 Priscilla Walmsley 的站点复制并粘贴该函数,或将其保存在单独的文件中(推荐),然后使用<xsl:import><xsl:include>将此样式表文件导入/包含到您的转换中。

最后,这些问题表明您需要更系统地介绍 XSLT。找一本好书,好好读。你不会后悔的。这个答案可能有助于列出我认为好的 XSLT 和 XPath 学习资源。

于 2011-05-04T12:57:44.413 回答
2

采用

<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,定义了您链接到的函数库的命名空间。您还需要下载函数库实现并将其导入,如图所示。

于 2011-05-04T12:39:54.723 回答