2011-07-10 15 views
2

拡張メソッドによってxmlが返されました。このxmlに<xsl:for-each>を使用するのを手伝ってください。XSLT拡張メソッドの戻り値に対するXpathの使用

public class CustomObj 
{ 
    //function that gets called from XSLT 
    public XPathNodeIterator GetResultTable() 
    { 
     DataTable table = new DataTable("Table1"); 

     table.Columns.Add("SourceCity"); 
     table.Columns.Add("DestinationCity"); 
     table.Columns.Add("Fare"); 

     table.Rows.Add(new object[] { "New York", "Las Vegas", "100" }); 
     table.Rows.Add(new object[] { "New York", "London", "200" }); 
     table.Rows.Add(new object[] { "New York", "New Delhi", "250" }); 

     StringWriter writer = new StringWriter(); 
     table.WriteXml(writer); 

     XmlDocument doc = new XmlDocument(); 
     XmlElement root = doc.CreateElement("Root"); 
     root.InnerXml = writer.ToString(); 
     doc.AppendChild(root); 

     return doc.CreateNavigator().Select("root"); 
    } 
} 

このxmlを繰り返し処理します。いくつか助けてください。私はXSLTを初めて使用しており、与えられたxml自体に例を挙げることができれば感謝しています。

+1

このコード出力にXMLを指定すると便利です。 – stuartd

+0

良い質問、+1。私の答えは完全な解決策を見てください。 –

答えて

2

を注意するために2つのものがあります。

  1. それは、拡張機能を経由してその結果を取得するより方法GetResultTable()を呼び出した結果に変換を適用するためにはるかに自然です。 -

    return doc.CreateNavigator().Select("root"); 
    

    なしがあるのでSelect()方法は何も選択しない文に

GetResultTable()方法が全く任意のノードを返しません書かれたよう

  • root要素はdocです。 XMLとXPathでは大文字と小文字が区別されるため、Rootという要素は選択されません。

    XSLT変換xsl:for-eachを使用する必要は全くありません。これは、ほとんどの場合、良い方法ではないと考えられます。アプリケーションを実行すると

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:my="my:extension" 
    exclude-result-prefixes="my"> 
        <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    
        <xsl:template match="/"> 
        <html> 
         <table border="1"> 
         <tr> 
          <td>Source</td> 
          <td>Destination</td> 
          <td>Fare</td> 
         </tr> 
         <xsl:apply-templates select="my:GetResultTable()/*/Table1"/> 
         </table> 
        </html> 
        </xsl:template> 
    
        <xsl:template match="Table1"> 
        <tr> 
         <xsl:apply-templates/> 
        </tr> 
        </xsl:template> 
    
        <xsl:template match="Table1/*"> 
        <td> 
         <xsl:apply-templates/> 
        </td> 
        </xsl:template> 
    </xsl:stylesheet> 
    

    、:

    namespace TestXml 
    { 
        using System; 
        using System.Data; 
        using System.IO; 
        using System.Xml; 
        using System.Xml.XPath; 
        using System.Xml.Xsl; 
    
        class Program 
        { 
         static void Main(string[] args) 
         { 
          CustomObj co = new CustomObj(); 
          XPathNodeIterator xpni = co.GetResultTable(); 
    
          XslCompiledTransform xslt = new XslCompiledTransform(true); 
          xslt.Load(@"..\..\My.xslt"); 
    
          XsltArgumentList xargs = new XsltArgumentList(); 
          xargs.AddExtensionObject("my:extension", co); 
    
          XmlDocument fakeDoc = new XmlDocument(); 
          fakeDoc.LoadXml("<t/>"); 
    
          StringWriter sw = new StringWriter(); 
    
          xslt.Transform(fakeDoc.CreateNavigator(), xargs, sw); 
    
          string result = sw.ToString(); 
    
          Console.Write(result); 
         } 
        } 
    
        public class CustomObj 
        { //function that gets called from XSLT  
         public XPathNodeIterator GetResultTable()  
         {   
          DataTable table = new DataTable("Table1");   
          table.Columns.Add("SourceCity");   
          table.Columns.Add("DestinationCity");   
          table.Columns.Add("Fare");   
          table.Rows.Add(new object[] { "New York", "Las Vegas", "100" });   
          table.Rows.Add(new object[] { "New York", "London", "200" });   
          table.Rows.Add(new object[] { "New York", "New Delhi", "250" });   
          StringWriter writer = new StringWriter();   
          table.WriteXml(writer);   
          XmlDocument doc = new XmlDocument();   
          XmlElement root = doc.CreateElement("Root");   
          root.InnerXml = writer.ToString();   
          doc.AppendChild(root);   
          return doc.CreateNavigator().Select("Root");  
         } 
        } 
    } 
    

    とファイルMy.xslt

    は、ここにこの質問がを要求何のための完全なコードがあると述べました望ましい結果が得られる

    <html> 
        <table border="1"> 
        <tr> 
         <td>Source</td> 
         <td>Destination</td> 
         <td>Fare</td> 
        </tr> 
        <tr> 
        <td>New York</td> 
        <td>Las Vegas</td> 
        <td>100</td> 
        </tr> 
        <tr> 
        <td>New York</td> 
        <td>London</td> 
        <td>200</td> 
        </tr> 
        <tr> 
        <td>New York</td> 
        <td>New Delhi</td> 
        <td>250</td> 
        </tr> 
        </table> 
    </html> 
    
  • 関連する問題