在XSL中转义标记名

时间:2011-03-13 11:52:08

标签: xml xml-namespaces

我正在尝试使用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级别没有任何意义,我不想注册它。有什么方法可以逃脱标记名中的字符吗?

(当然我可以很容易地做一些其他的解决方法,比如连接一个输出相同的字符串。)

2 个答案:

答案 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处理器将使用它们定义的任何命名空间来表示元素。