2011-08-25 101 views
2

看起來每個人都說如果你使用XslTransform,你可以調用Load來首先加載樣式表,然後調用Transform來轉換它。不過,我有以下XML文件:xslTransform with xml-stylesheet

<?xml version="1.0" encoding="UTF-8" ?> 
<?xml-stylesheet type="text/xsl" href="some_stylesheet.xsl" ?> 
.... 
</xml> 

是我該先加載XML,找到樣式表節點,然後調用加載加載樣式表,或者是有另一種方式做到這一點?

+4

我真的希望人們認爲downvote的問題會給出一個理由。這個網站與幫助人們學習其他任何東西一樣多,人們無法瞭解是否沒有任何反饋,而不是一個downvote。 – David

+1

@David:完全不同意。 – Tomalak

+0

有沒有另一種方法做什麼?你需要做什麼:使用'<?xml-stylesheet?>處理指令中指定的樣式表來處理XML?那麼是的,你必須從PI中檢索僞屬性。或者您需要使用其他預定義的樣式表來處理它? – LarsH

回答

5

<? ... ?>正在處理指令(PI),所以<?xml-stylesheet ... ?>是一個提示如何轉換你的XML。但那不會自動發生。這些指令的解釋取決於處理器。如何處理這些信息取決於您的要求:

您可以通過XmlDocument,XDocument ...加載xml,PI將被忽略。你可以用你的xml來做任何你想要的:按原樣使用它,通過你選擇的任何xsl轉換來轉換它,或者檢索PI的屬性並使用該轉換。

回來你原來的問題:如果你希望你的XML由給定的XSLT轉化,那麼工作流程如你預期它:

  • 加載XML
  • 找回的href到XSLT轉換
  • 負載XSLT
  • 通過XSLT
+1

我很高興知道他在說什麼的人幫助了這個人。好答案! +1。 – David

+1

如果您指定* how *來檢索href,這個答案會更有幫助。由於PI沒有真正的屬性,有什麼方法可以檢索'href'僞屬性的值?例如。 http://stackoverflow.com/questions/2119699/how-can-i-get-the-href-attribute-value-out-of-an-xml-stylesheet-node – LarsH

+0

看到這個問題如何檢索PI屬性:http://stackoverflow.com/questions/3100345/how-to-read-read-processing-instruction-from-an-xml-file-using-net-3-5 – Achim

1

實施轉換XML處理指令取決於用戶代理。 .NET XML庫不是用戶代理,您的程序是。所以是的,你將不得不看這個處理指令並自己加載XSLT。

如果你需要處理這個PI的所有榮耀,你絕對應該看看the W3C recommendation。 PI不僅可以包含對樣式表的引用(即僞屬性)。如果您正在處理的文檔使用PI的每個方面,這可能很重要。

2

您正在加載源XML,XSLT加載和應用彼此 有一個在.NET有限的原生支持XSLT2所以我建議使用AltovaXML庫altova xml,使用可以在那裏找到altova xml online documentaion

XSLT 2.0變換(XML到XML)

// Specify folder (AltovaXMLExamples folder) 
// Check if filepath is correct for you 
String strExamplesFolder = Environment.GetEnvironmentVariable("ProgramFiles") + 
"\\Altova\\AltovaXML2011\\AltovaXMLExamples\\"; 

// Create a new AltovaXML instance and access its engines 
Altova.AltovaXML.Application AltovaXML = new Altova.AltovaXML.Application(); 

// Use XSLT2 Engine of AltovaXML to transform simple.xml using CopyInputXSLT2.xsl 
Altova.AltovaXML.IXSLT2 AltovaXMLXSLT2 = AltovaXML.XSLT2; 
AltovaXMLXSLT2.InputXMLFileName = strExamplesFolder + "simple.xml"; 
AltovaXMLXSLT2.XSLFileName = strExamplesFolder + "CopyInputXSLT2.xsl"; 
AltovaXMLXSLT2.Execute(strExamplesFolder + "simpleOutputFromXML.xml"); 

XSLT 2.0變換(字符串到XML)

// Specify folder (AltovaXMLExamples folder) 
// Check if filepath is correct for you 
String strExamplesFolder = Environment.GetEnvironmentVariable("ProgramFiles") + 
    "\\Altova\\AltovaXML2011\\AltovaXMLExamples\\"; 

// Create a new AltovaXML instance and access its engines 
Altova.AltovaXML.Application AltovaXML = new Altova.AltovaXML.Application(); 

// Use XSLT2 Engine of AltovaXML to transform input string using CopyInputXSLT2.xsl 
Altova.AltovaXML.IXSLT2 AltovaXMLXSLT2 = AltovaXML.XSLT2; 
AltovaXMLXSLT2.InputXMLFromText = "<?xml version='1.0'?><doc>Hello World</doc>"; 
AltovaXMLXSLT2.XSLFileName = strExamplesFolder + "CopyInputXSLT2.xsl"; 
AltovaXMLXSLT2.Execute(strExamplesFolder + "simpleOutputFromString.xml"); 

XSLT 2.0轉換(字符串轉換爲字符串)

// Specify folder (AltovaXMLExamples folder) 
// Check if filepath is correct for you 
String strExamplesFolder = Environment.GetEnvironmentVariable("ProgramFiles") +  
    "\\Altova\\AltovaXML2011\\AltovaXMLExamples\\"; 

// Create a new AltovaXML instance and access its engines 
Altova.AltovaXML.Application AltovaXML = new Altova.AltovaXML.Application(); 

// Use XSLT2 Engine of AltovaXML to transform input string using CopyInputXSLT2.xsl 
Altova.AltovaXML.IXSLT2 AltovaXMLXSLT2 = AltovaXML.XSLT2; 
AltovaXMLXSLT2.InputXMLFromText = "<?xml version='1.0'?><doc>Hello World</doc>"; 
AltovaXMLXSLT2.XSLFileName = strExamplesFolder + "CopyInputXSLT2.xsl"; 
String strResult = AltovaXMLXSLT2.ExecuteAndGetResultAsString(); 

// Show result 
MessageBox.Show("XSLT 2.0 engine answered: " + strResult); 
+0

我不明白這些示例是如何解決是否從處理指令中獲取樣式表名稱的問題。 – LarsH