在使用函数检索节点集时,如何在节点集中显示值?

时间:2016-05-11 11:11:57

标签: xml xslt foreach

我有一个名为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中使用它时,它并没有显示任何值。我尝试删除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;
}

这让我可以迭代我需要的东西。

1 个答案:

答案 0 :(得分:0)

看起来你的自定义函数没有返回一个xml文档或文档片段,它可能只是一个字符串,但却无法看到我无法确定的那个函数。

换句话说,你已经相当于

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

而不是

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

你无法处理XML,因为它不是,它只是标记。在其上调用节点集不会将其解析为XML,而是将其转换为一个文本节点的集合。