2013-05-07 6 views
2

Я работаю над проектом, который требует, чтобы я загрузил XML-документ в xslt и преобразовал его для отображения в таблице html. Проблема в том, что, поскольку я использую LINQ для создания XML, все теги элементов являются тегами XElement, поэтому свойство «xsl: value-of select» не будет читать XElement. Мне интересно, есть ли способ конвертировать XElement в XmlElement или просто XSLT читать XElements вместо XMLElements?Преобразование XElement в XmlElement для преобразования XSLT ASP.NET C#

Вот код, где я загрузить данные в файл XML с помощью LINQ:

List<Prod> Products = utils.getProducts(); 


    XElement xml = new XElement("Products", Products.Select(x => new XElement("Product", 
              new XElement("ProductID", x.ProductID), 
              new XElement("ProductName", x.ProductName), 
              new XElement("SupplierID", x.SupplierID), 
              new XElement("CategoryID", x.CategoryID), 
              new XElement("QuantityPerUnit", x.QuantityPerUnit), 
              new XElement("UnitPrice", x.UnitPrice), 
              new XElement("UnitInStock", x.UnitInStock), 
              new XElement("UnitsOnOrder", x.UnitsOnOrder), 
              new XElement("ReorderLevel", x.ReorderLevel)))); 




    xml.Save("C:/Users/Aaron/Documents/Visual Studio 2012/WebSites/INFO451Final/Part_B/Prod.xml"); 

Вот код для моего XSLT:

<xsl:template match="/"> 
    <html> 
     <body> 
     <h2>Products</h2> 
     <table border="1"> 
     <tr bgcolor="#9acd32"> 
     <th>ProductID</th> 
     <th>ProductName</th> 
     <th>SupplierID</th> 
     <th>CategoryID</th> 
     <th>QuantityPerUnit</th> 
     <th>UnitPrice</th> 
     <th>UnitInStock</th> 
     <th>UnitsOnOrder</th> 
     <th>ReorderLevel</th> 

     </tr>   
     <xsl:for-each select="Product"> 
      <tr> 
      <td> 
       <xsl:value-of select="ProductID"/> 
      </td> 
      <td> 
       <xsl:value-of select="ProductName"/> 
      </td> 
      <td> 
       <xsl:value-of select="SupplierID"/> 
      </td> 
      <td> 
       <xsl:value-of select="CategoryID"/> 
      </td> 
      <td> 
       <xsl:value-of select="QuantityPerUnit"/> 
      </td> 
      <td> 
       <xsl:value-of select="UnitPrice"/> 
      </td> 
      <td> 
       <xsl:value-of select="UnitInStock"/> 
      </td> 
      <td> 
       <xsl:value-of select="UnitsOnOrder"/> 
      </td> 
      <td> 
       <xsl:value-of select="ReorderLevel"/> 
      </td> 
      </tr> 

     </xsl:for-each> 

    </table> 
    </body> 
</html> 

Так , сейчас все, что загружается, являются заголовками, так как «xsl: for-each» также не работает.

Любая помощь была бы принята с благодарностью.

+0

Я только что сделал веб-поиск для «конвертирования XElement в XmlElement» и получил много многообещающих хитов. Вы пытались это сделать, и если да, то что случилось? –

+0

Я пробовал, что, однако, я не смог реализовать решения в таблице html, и это то, что мне нужно сделать. – Fuzzerker

+0

Ну, это из-за отказа конвертировать XElement в XmlElement или что-то еще? Важно уметь выделять задачи. –

ответ

0

Просто используйте: your.xDocument.CreateNavigator() и передать результат в качестве параметра к Transform() метода XslCompiledTransform.

Вот пример, как именно это сделать:

string xslMarkup = @"<?xml version='1.0'?> 
<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'> 
    <xsl:template match='/Parent'> 
     <Root> 
      <C1><xsl:value-of select='Child1'/></C1> 
      <C2><xsl:value-of select='Child2'/></C2> 
     </Root> 
    </xsl:template> 
</xsl:stylesheet>"; 

XDocument xmlTree = new XDocument(
    new XElement("Parent", 
     new XElement("Child1", "Child1 data"), 
     new XElement("Child2", "Child2 data") 
    ) 
); 

XDocument newTree = new XDocument(); 
using (XmlWriter writer = newTree.CreateWriter()) { 
    // Load the style sheet. 
    XslCompiledTransform xslt = new XslCompiledTransform(); 
    xslt.Load(XmlReader.Create(new StringReader(xslMarkup))); 

    // Execute the transform and output the results to a writer. 
    xslt.Transform(xmlTree.CreateNavigator(), writer); 
} 

Console.WriteLine(newTree); 

Этот пример производит следующий вывод:

<Root> 
    <C1>Child1 data</C1> 
    <C2>Child2 data</C2> 
</Root> 

Для получения дополнительной информации см этот документ MSDN: Extensions.CreateNavigator Method (XNode)