Xml 为具有相同名称但不同子元素的节点创建唯一位置计数器

Xml 为具有相同名称但不同子元素的节点创建唯一位置计数器,xml,excel,xslt,Xml,Excel,Xslt,我正在尝试进行XSLT转换 XML输入如下所示 <root> <row> <col1>John</col1> <col2>2</col2> <col3>Hello<col3> <row> <col1>John</col1> <col2>3</col2>

我正在尝试进行XSLT转换

XML输入如下所示

<root>
    <row>
        <col1>John</col1>
        <col2>2</col2>
        <col3>Hello<col3>
   <row>
        <col1>John</col1>
        <col2>3</col2>
        <col3>Hello<col3>
   <row>
        <col1>Eddie</col1>
        <col2>3</col2>
        <col3>Hello<col3>

约翰
2.
你好
约翰
3.
你好
埃迪
3.
你好
我正在转换XML数据并在Excel中打开它。我正在尝试在Excel中创建某种位置计数器。每行表示一个人的文件。一些文件跨越多行,如上图所示。我想为每个文件创建一个行位置计数器。例如,John在excel工作表中有两行数据。我想要一行让计数器读“1”,另一行读“2”。而Eddie的位置计数器只能显示“1”


我应该看什么或试着做什么?

如果您的数据已经排序,您可能不进行分组就可以离开。例如,给定格式良好的测试输入:

<root>
    <row>
        <col1>Alpha</col1>
        <col2>001</col2>
    </row>
    <row>
        <col1>Alpha</col1>
        <col2>002</col2>
    </row>
    <row>
        <col1>Alpha</col1>
        <col2>003</col2>
    </row>
    <row>
        <col1>Bravo</col1>
        <col2>004</col2>
    </row>
    <row>
        <col1>Bravo</col1>
        <col2>005</col2>
    </row>
    <row>
        <col1>Charlie</col1>
        <col2>006</col2>
    </row>
    <row>
        <col1>Delta</col1>
        <col2>007</col2>
    </row>
    <row>
        <col1>Delta</col1>
        <col2>008</col2>
    </row>
    <row>
        <col1>Delta</col1>
        <col2>009</col2>
    </row>
</root>

阿尔法
001
阿尔法
002
阿尔法
003
布拉沃河
004
布拉沃河
005
查理
006
三角洲
007
三角洲
008
三角洲
009
以下样式表:

XSLT1.0

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/root">
    <output>
        <xsl:for-each select="row">
            <xsl:copy>
                <col0>
                    <xsl:value-of select="count(preceding-sibling::row[col1=current()/col1])+1"/>
                </col0>
                <xsl:copy-of select="*"/>
            </xsl:copy>
        </xsl:for-each>
    </output>
</xsl:template>

</xsl:stylesheet>

将返回:

<?xml version="1.0" encoding="UTF-8"?>
<output>
   <row>
      <col0>1</col0>
      <col1>Alpha</col1>
      <col2>001</col2>
   </row>
   <row>
      <col0>2</col0>
      <col1>Alpha</col1>
      <col2>002</col2>
   </row>
   <row>
      <col0>3</col0>
      <col1>Alpha</col1>
      <col2>003</col2>
   </row>
   <row>
      <col0>1</col0>
      <col1>Bravo</col1>
      <col2>004</col2>
   </row>
   <row>
      <col0>2</col0>
      <col1>Bravo</col1>
      <col2>005</col2>
   </row>
   <row>
      <col0>1</col0>
      <col1>Charlie</col1>
      <col2>006</col2>
   </row>
   <row>
      <col0>1</col0>
      <col1>Delta</col1>
      <col2>007</col2>
   </row>
   <row>
      <col0>2</col0>
      <col1>Delta</col1>
      <col2>008</col2>
   </row>
   <row>
      <col0>3</col0>
      <col1>Delta</col1>
      <col2>009</col2>
   </row>
</output>

1.
阿尔法
001
2.
阿尔法
002
3.
阿尔法
003
1.
布拉沃河
004
2.
布拉沃河
005
1.
查理
006
1.
三角洲
007
2.
三角洲
008
3.
三角洲
009

注意:这不是一种非常快速的方法;如果您有一个非常大的数据集,您可能需要等待一段时间。

甚至在开始为此编写XSLT之前,您也需要知道您正在转换XML的内容,因此如果您可以编辑问题以显示预期的输出,这将非常有帮助。至于转换本身,这看起来很像一个分组问题。假设您使用的是XSLT1.0,请看一看解释如何在XSLT1.0中进行“Muenchian分组”的内容。您的XML看起来无效,因为它现在有结束行标记。您能否创建有效的样本以及输出样本?