2016-05-11 1 views
0

テーブルテンプレートとして使用したいFourColumnTableというスタイルシートがあります。現時点ではこのようになりますし、その下に示すXML使用しています:関数を使用して値を取得するときにノードセット内に値を表示するにはどうすればよいですか?

<?xml version="1.0" encoding="iso-8859-1"?> 
<xsl:stylesheet xmlns:xsl"http://www.w3.org/1999/XSL/Transform" version="2.0"> 

    <xsl:template name="FourColumnTable"> 
     <xsl:param name="rows" /> 

     <table> 
      <tbody> 
       <tr> 
        <td>Name</td> 
        <td>Age</td> 
        <td>Name</td> 
        <td>Age</td> 
       </tr> 
      </tbody> 
     </table> 

     <xsl:variable name="itemCount" select="count($rows/*)" /> 

     <xsl:if test="$itemCount &gt; 1"> 
      <xsl:for-each select="$rows/MyTableData"> 
       <table> 
        <tbody> 
         <tr> 
          <td><xsl:value-of select="name" /></td> 
          <td><xsl:value-of select="age" /></td> 
          <td>blank for now</td> 
          <td>blank for now</td> 
         </tr> 
        </tbody> 
       </table> 
      </xsl:for-each> 
     </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

データは文字列として、いくつかのXMLを返す関数を使用して取得されています。 xmlは次のようになります。

<MyDataSet> 
    <MyTableData> 
    <name>Bob</name> 
    <age>25</age> 
    </MyTableData> 
    <MyTableData> 
    <name>Karen</name> 
    <age>36</age> 
    </MyTableData> 
    <MyTableData> 
    <name>Frank</name> 
    <age>58</age> 
    </MyTableData> 
</MyDataSet> 

私は現在このテーブルを入れたいと思っています。だから私は、次のことをやっている現時点では:

<xsl:template name="CustomerData"> 
    <xsl:call-template name="FourColumnTable"> 
    <xsl:with-param name="rows" select="msxml:node-set(myFunctions:GetCustomerData())" /> 
    </xsl:call-template> 
</xsl:template> 

現時点では、これはノード・セットを作成するようだが、私がしようとするとfor-eachでそれを使用する場合には、任意の値は表示されません。 「$行/ MyDataSet/*」それを変更for-each select文のための

  • :私はif statementを削除してから次の操作を行ってみました。
  • for-each selectステートメントを "$ rows/MyDataSet/MyTableData"に変更します。
  • for-each selectステートメントを "$ rows/node()"に変更し、 "value-of"のselectステートメントの最初の列に "$ rows/node()"を追加します。これはxmlごとにすべてのデータを表示したので、少なくとも$行にはデータがあることを知っています。

私は上記のバリエーションを試しましたが、それらは言及する価値がある主要なテストのようです。私が理解できないことは、すべてのデータを返す理由ですが、特定のノード(MyTableDataノード)でループすることができません。助けてください。

UPDATEここ

である私の機能GetCustomerData()

public string GetCustomerData() 
{ 
    var sb = new StringBuilder(); 
    var xmlDoc = new XmlDocument(); 

    xmlDoc.LoadXml(this.GetAllCustomerData()); 

    var nodeList = xmlDoc.SelectNodes("/MyTableData"); 

    if (nodeList != null && nodeList.Count > 0) 
    { 
     foreach (XmlNode node in nodeList) 
     { 
      sb.Append(node.InnerText + EnvironmentNewLine); 
     } 
    } 

    return sb.ToString(); 
} 

私は、これは代わりにXmlDocumentを返す必要が推測していますか?しかし、私のGetAllCustomerDataメソッドは、私が必要とするものよりもはるかに多くを返します。そのため、私が望むノードを選択するのです。これをXmlNodeListとし、それをXmlDocumentに変換できますか?

:私は私のテーブルテンプレートで、その後であり、以下のように単純に私はこのような foreachステートメントの中で反復処理するものノード変更XMLドキュメントを返すために、私の機能を変更することにしました2

UPDATE

public XmlDocument GetCustomerData() { var xmlDoc = new XmlDocument(); xmlDoc.LoadXml(this.GetAllCustomerData()); return xmlDoc; } 

これにより、私は必要なものを繰り返し処理することができました。

+2

あなたは実際に渡しているXML文書の断片ですか?あなたは関数がxmlを文字列として返すと言っています。あなたが渡しているノードセットはマークアップ付きの単一のテキストノードを含んでいるだけかもしれません。テストとして、ダミーデータを 'などに入れます。'、何も渡さずに動作するかどうかを確認してください。 – Flynn1179

+0

ここでは問題を再現するには十分ではありません。テストを行い、 ''が返すものを参照する必要があります。 - P.S.あなたのスタイルシートはバージョン2.0ですが、あなたはXSLT 1.0プロセッサを使用しているようです。 –

+0

@ Flynn1179 - これは問題のようです。私はいくつかのテストデータを作成しました(基本的には私のレプリカですが、そのほんの少し)、うまくいきました。それは単なる文字列のように見えます。私はXMLDocumentを返すように関数を変更する必要があると思います。 – sr28

答えて

0

あなたのカスタム関数がxmlドキュメントやドキュメントフラグメントを返さないようですが、それはたぶん文字列ですが、その関数を見ることができないと私は確かに言い表せません。言い換えれば

は、あなたの代わりに

<xsl:param name="rows"><MyDataSet>Data</MyDataSet></xsl:param> 

<xsl:param name="rows">&lt;MyDataSet&gt;Data&lt;/MyDataSet&gt;</xsl:param> 

と同等のものを持っているし、処理することはできません、それはありませんので、それだけだ、XMLの通りですマークアップ。ノードセットを呼び出すと、XMLに解析されず、1つのテキストノードのセットに変換されます。

+0

これは問題のようです。それで、私は関数から文字列ではなくXmlDocumentを返す必要があると思っています。 – sr28

+0

私の質問を関数で更新しました。 – sr28

+0

正直言って、そうしたXML文書からデータを取り出す場合は、気にしないでください。 XSLTをロードしたらすぐにxmlDocを返し、XSLTで必要なものを選んでください。 XMLを自分で返す拡張関数を実際に作成することはありませんでしたが、ドキュメント自体またはルート要素のいずれかを返す可能性があります。もちろん、パフォーマンスに影響する可能性のある膨大な量の他のデータは必要ありません。 – Flynn1179

関連する問題