2012-11-22 22 views
34

Tôi cố gắng để gọi SelectNode từ XmlDocument lớp và rắc rối do lỗi này:Trình quản lý không gian tên hoặc XsltContext cần thiết. Truy vấn này có một tiền tố, biến đổi, hoặc người dùng xác định chức năng

Namespace Manager or XsltContext needed. This query has a prefix, variable, or user-defined function.

Mã của tôi:

public void Add(ref XmlDocument xmlFormat, String strName) 
    { 
     XmlDocument dom; 
     XSLTemplate xsl = null; 
     String strPath = ""; 
     XmlNodeList nl; 
     XmlAttribute na; 
     int n; 

     nl = (XmlNodeList)xmlFormat.SelectNodes("//xsl:import/@href",nsm); 
    } 

và xsl :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:import href="stylesheets/r_adresetiket.xsl" /> 
    <xsl:template match="/"> 
     <xsl:call-template name="retouradres"> 
      <xsl:with-param name="_retouradres" select="data/adresetiket/_retouradres" /> 
      <xsl:with-param name="minofdir" select="data/adresetiket/afzendgegevens/afzendgegevens" /> 
      <xsl:with-param name="checked" select="data/adresetiket/LB" /> 
     </xsl:call-template> 
    </xsl:template> 
</xsl:stylesheet> 

Trả lời

41

Bạn phải thêm xsl namespace để XmlNamespaceManager:

var document = new XmlDocument(); 
document.Load(...); 
var nsmgr = new XmlNamespaceManager(document.NameTable); 
nsmgr.AddNamespace("xsl", "http://www.w3.org/1999/XSL/Transform"); 

var nl = document.SelectNodes("//xsl:import/@href", nsmgr); 
+0

Cảm ơn Rịa làm việc của nó –

+0

Cảm ơn bạn! Ví dụ hoàn hảo cho tôi, tất cả đều hoạt động tốt ngay bây giờ. – Andrew

2

Tôi biết đó là câu hỏi cũ và đã được trả lời nhưng có thể hữu ích cho những người muốn tránh sử dụng XmlNamespaceManager. Tài liệu này có thể được đi qua bởi GetElementsByTagName nhưng nó cần quan tâm hơn nữa, bạn đã nên biết về cấu trúc của XmlDocument của bạn:

var nodes = document.GetElementsByTagName("xsl:import"); 
var href = nodes[0].Attributes["href"];//be sure which node to take 
Các vấn đề liên quan