我有一个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?
答案 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
不是有效的命名空间字符串。