我正在尝试使用xslt呈现以下HTML代码:
<foo:bar href="[MYURL]"/>
我创建了以下模板:
<xsl:template name="displaySomeLink">
<xsl:param name="url"/>
<foo:bar href="{$url}"></foo:bar>
</xsl:template>
我打算称之为:
<xsl:call-template name="displaySomeLink">
<xsl:with-param name="url" select="[MYURLSELECTIONLOGICS]"/>
</xsl:call-template>
但是,我的xslt解析器正确地指出foo前缀没有定义,并且由于foo前缀在xslt级别没有任何意义,我不想注册它。有什么方法可以逃脱标记名中的字符吗?
(当然我可以很容易地做一些其他的解决方法,比如连接一个输出相同的字符串。)
答案 0 :(得分:1)
XSLT样式表必须是格式良好的XML文档。
您得到的错误根本不是特定于XSLT的 - 它是XML解析错误。
使XSLT样式表成为格式良好的XML文档(保留名称foo:bar
)的唯一方法是定义一个绑定了前缀foo
的命名空间 - 位于从foo:bar
元素的位置可见(在范围内)。
这样做的一种方法是在顶部元素上定义命名空间(xsl:stylesheet
元素):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:foo="my:foo" exclude-result-prefixes="foo">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<!-- more code here -->
</xsl:stylesheet>
另外,请注意使用exclude-result-prefixes="foo"
属性。这指定了与其包含的列表中的任何前缀相关联的命名空间节点(在这种情况下只是foo
),XSLT处理器不会在任何文字结果元素上复制它。
答案 1 :(得分:0)
只需在XSLT样式表中定义foo
名称空间前缀:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:foo="http://foo.foo/foo"
...>
或
<xsl:template name="whatever" xmlns:foo="http://foo.foo/foo">
...
或
<xsl:template name="whatever">
...
<foo:bar xmlns:foo="http://foo.foo/foo" />
...
你是正确的,因为foo
名称空间前缀及其名称空间在XSLT中没有意义,但是没有默认名称空间“”或除http://www.w3.org/1999/XSL/Transform
名称空间之外的任何其他名称空间(通常由xsl
前缀。
XSLT处理器将使用它们定义的任何命名空间来表示元素。