2013-11-04 39 views
0

我想在XSLT文檔交給XML轉換之前做一些後處理。我認爲最好的選擇是將它加載爲XmlDocument,然後像我通常那樣通過SelectNodes遍歷待更新的節點,但是我似乎無法定位所需的節點。每個查詢都會返回0個找到的節點。使用C#和XmlDocument遍歷一個XSL DOM

我懷疑它與命名空間有關,但不知道如何。

樣品XSLT:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" omit-xml-declaration="yes" indent="yes"/> 
    <html xmlns="http://www.w3.org/1999/xhtml"> 
     <head> 
     </head> 
     <body> 
     <a href="/"> 
     </body> 
    </html> 
    </xsl:template> 
</xsl:stylesheet> 

樣品C#:

XmlDocument style = new XmlDocument(); 
style.Load("sample.xslt"); 
foreach (XmlNode anchor in style.SelectNodes("//a")) 
    ... 

但它從來沒有發現<a>標籤 - 或任何其他標記我試試。

我試過的代碼更改爲此:

XmlDocument style = new XmlDocument(); 
style.Load("sample.xslt"); 

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

foreach (XmlNode anchor in style.SelectNodes("//a", nsmgr)) 
    ... 

這實際上讓我選擇與xsl:前綴(如.SelectNodes("/xsl:stylesheet")),但無內,HTML節點的節點。

任何建議將不勝感激!

回答

0

您必須讓XPAth選擇器知道您需要HTML元素。雖然HTML元素沒有前綴,但它們確實有'默認名稱空間'。

在您的XPath中,您必須反映這一點。

將「html」作爲前綴加上「http://www.w3.org/1999/xhtml」作爲命名空間管理器的名稱空間URI。

然後用html加前綴你的XPath:查詢html元素。

希望這會有所幫助,

+0

完美的工作。非常感謝您的幫助! – smilingkevin