XSLT创建一个变量以计算for-each内部的迭代次数

时间:2018-08-01 10:03:45

标签: c# xml xslt

我不知道如何创建变量和助手。

我是使用XSLT的新手,我有一个XML文件,该文件包含一些节点,这些节点的节点上有一些子代,我需要使用for-each来计数这些子代(每个for-each,我需要将该计数加1并还有我想从1开始的计数器)

我不知道如何创建变量并将其分配给值1。

以下是我需要的示例:

<root>
  <body>
    <sec id="sec1">
      <!--Parent also can contain no sub element or also can contain a free text-->
      <p></p>
      <p>some free text</p>
      <p>
        <!--Nodes I want to count it-->
        <childNodes></childNodes>
        <childNodes></childNodes>
        <childNodes></childNodes>
        <childNodes></childNodes>
        <childNodes></childNodes>
        <!--Nodes I want to count it-->
      </p>
    </sec>
    <sec id="sec2">
      <p>
        <!--Nodes I want to count it-->
        <childNodes></childNodes>
        <childNodes></childNodes>
        <childNodes></childNodes>
        <childNodes></childNodes>
        <childNodes></childNodes>
        <!--Nodes I want to count it-->
      </p>
      <p>
        <!--Nodes I want to count it-->
        <childNodes></childNodes>
        <childNodes></childNodes>
        <childNodes></childNodes>
        <childNodes></childNodes>
        <childNodes></childNodes>
        <!--Nodes I want to count it-->
      </p>
    </sec>
  </body>
</root>

我需要这样的输出

<root>
    <childNodes>
        <count> 
            The count of all childNodes
        </count>
    </childNodes>
</root>

您能帮助解决该问题吗,谢谢!

2 个答案:

答案 0 :(得分:0)

使用xml linq:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication58
{
    class Program
    {
        static void Main(string[] args)
        {
            XElement root = new XElement("root");
            XElement body = new XElement("body");
            root.Add(body);


            for (int id = 1; id <= 10; id++)
            {
                XElement newSec = new XElement("sec",
                    new XAttribute("id", "sec" + id.ToString()),
                    XElement.Parse("<!--Parent also can contain no sub element or also can contain a free text--><p></p>"),
                    new XElement("p", "some free text")
                    );
                body.Add(newSec);
                XElement nodes = new XElement("p");
                newSec.Add(nodes);

                for (int childCount = 1; childCount <= 10; childCount++)
                {
                    XElement newChild = new XElement("childNods", new XAttribute("id", "node" + childCount.ToString()),
                        "Child Text"
                     );
                    nodes.Add(newChild);

                }

            }


        }

    }
}

答案 1 :(得分:0)

基于共享的输出XML,有2种可能的输出选项。在XML中获取<childNodes>的总数,或者获取p/childNodes的单独计数。

<childNodes>的总数可以使用下面的模板获取

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 
    <xsl:output method="xml" />
    <xsl:strip-space elements="*" />

    <xsl:template match="root">
        <xsl:copy>
            <childNodes>
                <count><xsl:value-of select="count(//childNodes)" /></count>
            </childNodes>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

输出

<root>
    <childNodes>
        <count>15</count>
    </childNodes>
</root>

如果您需要单独计数

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 
    <xsl:output method="xml" />
    <xsl:strip-space elements="*" />

    <xsl:template match="root">
        <xsl:copy>
            <xsl:apply-templates />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="p">
        <xsl:if test="*">
            <childNodes>
                <count><xsl:value-of select="count(*)" /></count>
            </childNodes>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

输出

<root>
    <childNodes>
        <count>5</count>
    </childNodes>
    <childNodes>
        <count>5</count>
    </childNodes>
    <childNodes>
        <count>5</count>
    </childNodes>
</root>