我有一个名为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
中使用它时,它并没有显示任何值。我尝试删除if statement
,然后执行以下操作:
for-each
select语句,将其更改为&#34; $ rows / MyDataSet / *&#34;。for-each
select语句,将其更改为&#34; $ rows / MyDataSet / MyTableData&#34;。for-each
select语句,将其更改为&#34; $ rows / node()&#34;然后在第一列中选择&#39; value-of&#39;添加&#34; $ rows / node()&#34;。这显示了根据xml的所有数据,所以我知道$行至少有数据。我尝试过以上的变化,但这些似乎是值得一提的主要测试。我无法理解为什么它会为所有内容返回数据,但我无法遍历特定节点(MyTableData节点)。请帮助。
更新
这是我的函数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吗?
更新2
我选择将我的函数更改为简单地按原样返回xml文档,然后在我的表模板中更改我在foreach
语句中迭代的节点,如下所示:
public XmlDocument GetCustomerData()
{
var xmlDoc = new XmlDocument();
xmlDoc.LoadXml(this.GetAllCustomerData());
return xmlDoc;
}
这让我可以迭代我需要的东西。
答案 0 :(得分:0)
看起来你的自定义函数没有返回一个xml文档或文档片段,它可能只是一个字符串,但却无法看到我无法确定的那个函数。
换句话说,你已经相当于
<xsl:param name="rows"><MyDataSet>Data</MyDataSet></xsl:param>
而不是
<xsl:param name="rows"><MyDataSet>Data</MyDataSet></xsl:param>
你无法处理XML,因为它不是,它只是标记。在其上调用节点集不会将其解析为XML,而是将其转换为一个文本节点的集合。