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

时间:2014-11-18 22:14:49

标签: xml excel xslt

我正在尝试进行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>

我正在转换XML数据并在Excel中打开它。我正在尝试在Excel中创建某种位置计数器。每行表示一个人的文件。有些文件跨越多行,如上所示。我想要创建的是每个文件的行位置计数器。例如,John在excel表中有两行数据。我想要一行将计数器读为“1”而另一行读为“2”。虽然,Eddie的位置计数器只会读为“1”。

我应该注意或尝试做什么?

1 个答案:

答案 0 :(得分:0)

如果您的数据已经排序,您可能会在没有分组的情况下离开。例如,给定格式良好的测试输入

<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>

以下样式表:

XSLT 1.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>

注意:这不是一个非常快的方法;如果你有一个非常大的数据集,你可能需要等一下。