【问题标题】:XML Record Merging with XSLT 1.0XML 记录与 XSLT 1.0 的合并
【发布时间】:2015-05-13 18:47:31
【问题描述】:

我正在尝试使用 Microsoft Access 导出中的 XSLT 组合多条记录,但是我不知道如何根据唯一 ID 组合这些记录。

样本来源是:

<dataroot>
<Record>
    <OrderID>123</OrderID>
    <ItemID>1</ItemID>
</Record>
<Record>
    <OrderID>123</OrderID>
    <ItemID>2</ItemID>
</Record>

我希望它看起来像:

<Record>
<OrderID>123</OrderID>
<ItemSet>
    <ItemID>1</ItemID>
    <ItemID>2</ItemID>
</ItemSet>

我发现另一个关于类似问题的问题被问到,但是这与属性有关,我无法根据值找到解决方法。

Combine similar XML records/fields with XSL

我会使用 for-each-group,但 Access 在其转换中不支持它。

谢谢。

【问题讨论】:

标签: xml ms-access xslt


【解决方案1】:

我刚刚使用 Access 2010 尝试了以下操作,它对我有用。这张表名为 [Record]

OrderID  ItemID
-------  ------
    123       1
    123       2
    234       3
    234       4
    234       5

还有这个 XSLT 文件

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output encoding="utf-8" indent="yes" />
  <xsl:strip-space elements="*" />
  <xsl:key name="record" match="Record" use="OrderID" />
  <xsl:template match="/">
    <dataroot xmlns:od="urn:schemas-microsoft-com:officedata">
      <xsl:apply-templates select="@*|node()" />
    </dataroot>
  </xsl:template>
  <xsl:template match="*">
    <xsl:for-each select="Record[count(. | key('record', OrderID)[1]) = 1]">
      <Record>
        <xsl:copy-of select="OrderID" />
        <ItemSet>
          <xsl:for-each select="key('record',OrderID)">
            <xsl:copy-of select="ItemID" />
          </xsl:for-each>
        </ItemSet>
      </Record>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

当我使用上述转换将表导出为 XML 时

我明白了

<?xml version="1.0"?>
<dataroot xmlns:od="urn:schemas-microsoft-com:officedata">
  <Record>
    <OrderID>123</OrderID>
    <ItemSet>
      <ItemID>1</ItemID>
      <ItemID>2</ItemID>
    </ItemSet>
  </Record>
  <Record>
    <OrderID>234</OrderID>
    <ItemSet>
      <ItemID>3</ItemID>
      <ItemID>4</ItemID>
      <ItemID>5</ItemID>
    </ItemSet>
  </Record>
</dataroot>

【讨论】:

  • &lt;xsl:for-each-group&gt; 是 XSLT 2.0 指令。 AFAIK,微软在他们的任何产品中都不支持 XSLT 2.0 - 你的样式表也不使用它。
  • 看起来非常适合我需要做的事情。谢谢。
【解决方案2】:

扩展 Micheal 的建议,我认为您正在研究类似的内容,

  <xsl:key name="record" match="Record" use="OrderID"/>

  <xsl:template match="/*">
      <xsl:for-each select="Record[count(. | key('record', OrderID)[1]) = 1]">
        <xsl:copy-of select="OrderID"/>
        <ItemSet>
          <xsl:for-each select="key('record',OrderID)">
            <xsl:copy-of select="ItemID"/>
          </xsl:for-each>
        </ItemSet>
      </xsl:for-each>
  </xsl:template>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 2015-07-01
    • 2017-08-13
    • 1970-01-01
    相关资源
    最近更新 更多