问题与xmlns

时间:2010-05-19 10:53:36

标签: asp.net xml xslt xpath

我有一个xml文件和一个xslt文件。

xml文件具有xmlns =“exa:com.test”属性。

如果我在xml中删除此属性,xslt中的xpath语句就可以了。但如果我离开它,就行不通。

我使用以下代码混合xml和xslt:

XslCompiledTransform transformer = new XslCompiledTransform();

transformer.Load(HttpContext.Current.Server.MapPath("xslt\\searchresults.xslt"));  

transformer.Transform(xmlreader, null, utf8stringwriter);

我做错了什么?如果xml在顶部有xmlns属性,我怎么能混合xml和xslt?

2 个答案:

答案 0 :(得分:3)

不带前缀名称的xmlns属性将替换默认命名空间,以便您的查询匹配具有不同(空)命名空间的节点。您需要在XSLT XPath查询中使用带前缀的命名空间(或XmlNamespaceManager用于隔离的XPath查询),并且您的查询将按预期再次运行。

在XSLT中:

<xsl:stylesheet ... xmlns:exa="exa:com.test">

然后,假设您曾经匹配实例xyz,现在更改您的查询:

<xsl:template match="exa:xyz"> ...

通常,您可能希望阅读有关XML命名空间的一些文档。

答案 1 :(得分:1)

应该注意,虽然命名空间字符串只是被视为一个精确的文字字符串,用作没有其他含义的标识符。字符串必须符合IANA uri,这是为了保证名称空间的唯一性。一些解析器拒绝解析不符合的命名空间。

另请注意,因为它们是字符串http://www.w3.org/1999/xhtml,例如http://w3.org/1999/xhtml/用于名称空间完全不同的名称空间。

您可能想要了解XML中命名空间的工作原理。据我所知,exa:com.test不是有效的命名空间字符串。