2

私は、xml ドキュメントを xslt にロードし、それを変換して html テーブルに表示する必要があるプロジェクトに取り組んでいます。問題は、LINQ を使用して XML を作成しているため、すべての要素タグが XElement タグであるため、「xsl:value-of select」プロパティが XElement を読み取らないことです。XElement を XmlElement に変換する方法や、単純に XSLT に XMLElement ではなく XElement を読み込ませる方法はあるのでしょうか。

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」も機能しないため、現時点ではヘッダーのみが読み込まれます。

どんな助けでも大歓迎です。

4

1 に答える 1

1

:を使用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 メソッド (XNode)

于 2013-05-08T02:58:10.090 に答える