2015-07-10 2 views
0

Я использую C# для преобразования документа XML и он работает отлично:Добавьте код XSLT до преобразования

using System; 
using System.IO; 
using System.Xml; 
using System.Xml.Xsl; 
using System.Xml.XPath; 

public class XmlTransformUtil 
{ 

public static void Main(string[] args) 
{ 

    if (args.Length == 2) 
    { 

     Transform(args[0], args[1]); 
    } 
    else 
    { 

     PrintUsage(); 
    } 
} 

public static void Transform(string sXmlPath, string sXslPath) 
{ 
    try 
    { 
     //load the Xml doc 
     XPathDocument myXPathDoc = new XPathDocument(sXmlPath); 

     XslTransform myXslTrans = new XslTransform(); 

     //load the Xsl 
     myXslTrans.Load(sXslPath); 

     //create the output stream 
     XmlTextWriter myWriter = new XmlTextWriter 
      ("result.html", null); 

     //do the actual transform of Xml 
     myXslTrans.Transform(myXPathDoc, null, myWriter); 

     myWriter.Close(); 
    } 

    catch (Exception e) 
    { 
     Console.WriteLine("Exception: {0}", e.ToString()); 
    } 
} 

public static void PrintUsage() 
{ 
    Console.WriteLine 
    ("Usage: XmlTransformUtil.exe <xml path> <xsl path>"); 
} 

} 

Приведенный выше код работает отлично, однако, что я хочу сделать, это, прежде чем XSLT является Я хочу, чтобы он добавил дополнительные строки кода в определенные части XSLT.

XSLT Код:

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="/"> 
    <html lang="en-GB"> 
     <body style="font-family:'Praxis Com Light'; color:#632423; width:100%; font-size:14px !important;"> 

//MAIN BODY OF CODE 

     </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 

Как я хочу, чтобы код XSLT изменился в C# Перед преобразованием:

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:include href="HEAD.xslt"/> 
<xsl:include href="FOOT.xslt"/> 

<xsl:template match="/"> 
    <html lang="en-GB"> 
     <body style="font-family:'Praxis Com Light'; color:#632423; width:100%; font-size:14px !important;"> 

     <xsl:call-template name="Header"/> 

//MAIN BODY OF CODE 

      <xsl:call-template name="Footer"/> 

      </body> 
     </html> 
    </xsl:template> 
</xsl:stylesheet> 

Как это можно сделать?

+2

Посмотрите вместо того, чтобы передавать в параметры преобразование и отключайте его. Пример - http://stackoverflow.com/questions/1521064/passing-parameters-to-xslt-stylesheet-via-net – OldProgrammer

+0

Не знаете, в чем заключается трудность. Таблица стилей XSLT - это XML-документ, у вас есть инструмент (XSLT) для преобразования XML-документов, поэтому просто сделайте это. Является ли преобразование таблицы стилей правильной стратегией здесь, я не знаю (это мощный метод, но иногда есть другие способы, которые лучше), но внутренне, если вы хотите использовать XSLT для преобразования XSLT, это не проблема. –

ответ

1
XNamespace ns = "http://www.w3.org/1999/XSL/Transform"; 

XElement xslt = XElement.Load(sXslPath); 

xslt.AddFirst(new XElement(ns + "include", new XAttribute("href", "FOOT.xslt"))); 
xslt.AddFirst(new XElement(ns + "include", new XAttribute("href", "HEAD.xslt"))); 

XElement body = xslt.Descendants("body").Single(); 

body.AddFirst(new XElement(ns + "call-template", new XAttribute("name", "Header"))); 
body.Add(new XElement(ns + "call-template", new XAttribute("name", "Footer"))); 
+0

Я думаю, что недавно добавленный 'xsl: include' с относительным значением URL-адреса' href' правильно разрешен, вам нужно использовать 'XElement xslt = XElement.Load (xXslPath, LoadOptions.SetBaseUri)'. –

Смежные вопросы