将XElement转换为XmlElement以进行XSLT转换ASP.NET C#

时间:2013-05-07 20:36:16

标签: asp.net xml linq xslt xelement

我正在开发一个项目,它要求我将xml文档加载到xslt中并将其转换为在html表中显示。问题是因为我使用LINQ来创建XML,所有元素标签都是XElement标签,因此“xsl:value-of select”属性不会读取XElement。我想知道是否有办法将XElement转换为XmlElement或只是让XSLT读取XElements而不是XMLElements?

以下是我通过LINQ将数据加载到xml文件中的代码:

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”也不起作用。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

只需使用your.xDocument.CreateNavigator()并将结果作为参数传递给Transform()的{​​{1}}方法。

以下是如何执行此操作的示例

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);

有关详细信息,请参阅此MSDN文档 Extensions.CreateNavigator Method (XNode)