使用 XSLT 中的函数
我正在学习 XSLT。这些问题可能是显而易见的,但我现在真的很困惑。 Oxygen 返回以下两种错误:
未为“ownFunction()”声明命名空间。 (“未声明的命名空间前缀 {xs}”)
未知的系统函数 index-of-string()
XSLT 函数index-of-string
I从此网站获取的内容似乎无法被识别< /p>
这是 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>
I'm learning XSLT. These questions may be obvious, but I'm really stuck now.
Oxygen returns the following two kind of errors:
Namespace is not declared for 'ownFunction()'. ("undeclared namespace prefix {xs}")
unknown system function index-of-string()
The XSLT function
index-of-string
I got from this website doesn't seems to be recognized
This is a simplified version of the XSL file:
<?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>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这实际上是一个 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"
添加到样式表的顶部元素。您忘记从 Priscilla Walmsley 的网站复制并粘贴该函数,或者忘记将其保存在单独的文件中(推荐),然后使用将此样式表文件导入/包含到您的转换中。
或最后,此类问题表明您需要更系统地介绍 XSLT。找一本好书,好好读。你不会后悔的。 这个答案 可能有助于列出我认为好的 XSLT 和 XPath 学习资源。
This is actually an XML issue. Any XSLT stylesheet myst be a well-formed XML document. Among other requirements for well-formedness, any namespace prefix used must be bound to a namespace URI in a namespace declaration.
To correct this bind the
"xs"
prefix to"http://www.w3.org/2001/XMLSchema"
-- this means to addxmlns:xs="http://www.w3.org/2001/XMLSchema"
to an element (usually the top element is a good choice for this namespace.You have the same problem with
"foo:ownFunction"
. You must have the prefix"foo"
bound/defined and visible, before using it. Just addxmlns:foo="my:foo"
to the top element of your stylesheet.You have forgotten to either copy and paste the function from Priscilla Walmsley's site or to save it in a separate file (recommended) and then use
<xsl:import>
or<xsl:include>
to import/include this stylesheet file to your transformation.Finally, such issues show that you need a more systematic introduction of XSLT. Get a good book and read it well. You won't be sorry. This answer may be useful in listing what I consider good XSLT and XPath learning resources.
使用
该示例定义了架构命名空间并将其绑定到前缀
xs
,定义了您链接到的函数库的命名空间。您还需要下载函数库实现并导入它,如图所示。Use
That samples defines the schema namespace and binds it to the prefix
xs
, defines the namespace of the function library you linked to. You will also need to download the function library implementation and import it as shown.