【问题标题】:Creating a unique position counter for nodes with the same name but different children elements为具有相同名称但不同子元素的节点创建唯一的位置计数器
【发布时间】:2014-11-18 22:14:49
【问题描述】:

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

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

【问题讨论】:

  • 在开始为此编写 XSLT 之前,您还需要知道要转换 XML 的内容,因此如果您可以编辑问题以显示预期的输出,那将有很大帮助。至于转换本身,这看起来很像一个分组问题。假设您使用的是 XSLT 1.0,请查看 jenitennison.com/xslt/grouping/muenchian.html,它解释了如何在 XSLT 1.0 中进行“Muenchian 分组”。
  • 您的 XML 看起来无效,因为它现在有结束行标记。你能创建一个有效的样本以及一个输出样本吗?

标签: xml excel xslt


【解决方案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>

以下样式表:

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>

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多