テーブルテンプレートとして使用したい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 > 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; }
これにより、私は必要なものを繰り返し処理することができました。
あなたは実際に渡しているXML文書の断片ですか?あなたは関数がxmlを文字列として返すと言っています。あなたが渡しているノードセットはマークアップ付きの単一のテキストノードを含んでいるだけかもしれません。テストとして、ダミーデータを 'などに入れます。 '、何も渡さずに動作するかどうかを確認してください。 –
Flynn1179
ここでは問題を再現するには十分ではありません。テストを行い、 ' 'が返すものを参照する必要があります。 - P.S.あなたのスタイルシートはバージョン2.0ですが、あなたはXSLT 1.0プロセッサを使用しているようです。 –
@ Flynn1179 - これは問題のようです。私はいくつかのテストデータを作成しました(基本的には私のレプリカですが、そのほんの少し)、うまくいきました。それは単なる文字列のように見えます。私はXMLDocumentを返すように関数を変更する必要があると思います。 – sr28