XSLT 分组/合并子项(使用密钥)

Posted

技术标签:

【中文标题】XSLT 分组/合并子项(使用密钥)【英文标题】:XSLT Group/merge childs (using key) 【发布时间】:2012-12-16 16:47:03 【问题描述】:

我正在尝试了解如何使用我已经编写的代码来推断解决方案。

为了简单起见,我将首先解释我想要做什么以及到目前为止我得到了什么。

假设我在 XSLT 中有一个 XML 变量,其中包含几个具有相同标题属性的节点。

使用@Dimitre Novatchev solution 我已经设法将它们合并到一个节点中。

如果我有:

<t>
    <GroupData ID="xxx" Key="4" Temp="yyy">
        <ItemData ID="zzz" Value="3"/>
    </GroupData>
    <GroupData ID="yyy" Key="4" Temp="yyy">
        <ItemData ID="abc" Value="3"/>
    </GroupData>
    <GroupData ID="zzz" Temp="yyy">
        <ItemData ID="pqr" Value="1982"/>
    </GroupData>
    <GroupData ID="xxx" Key="4" Temp="yyy">
        <ItemData ID="www" Value="1982"/>
    </GroupData>
    <GroupData ID="yyy" Key="4" Temp="yyy">
        <ItemData ID="def" Value="1982"/>
    </GroupData>
    <GroupData ID="zzz" Temp="yyy">
        <ItemData ID="tuv" Value="1982"/>
    </GroupData>
</t>

使用以下键后

<xsl:key name="kGDByIdKey" match="GroupData" use="concat(@ID, '+', @Key)"/>

我会得到:

<t>
   <GroupData ID="xxx" Key="4" Temp="yyy">
      <ItemData ID="zzz" Value="3"/>
      <ItemData ID="www" Value="1982"/>
   </GroupData>
   <GroupData ID="yyy" Key="4" Temp="yyy">
      <ItemData ID="abc" Value="3"/>
      <ItemData ID="def" Value="1982"/>
   </GroupData>
   <GroupData ID="zzz" Temp="yyy">
      <ItemData ID="pqr" Value="1982"/>
      <ItemData ID="tuv" Value="1982"/>
   </GroupData>
</t>

现在我想稍微修改一下,我希望能够根据自己的决定合并/合并标题。考虑到这一点,在上面的示例中,我想将 xxx 和 zzz 定义为同一个组,尽管它们使用不同的标题(极端情况 - 在我的工作区中,我将它们定义为相同 - 我可能有更多情况,例如这个)。

如果你能告诉我一般应该做的方向,我将不胜感激(我想我需要修改我的密钥或使用替代方法 - generate-id 或其他东西)。

我发现自己只实施了需要大量不必要努力的糟糕解决方案。

【问题讨论】:

【参考方案1】:

我猜这是 XSLT1,这是一种耻辱,因为它在 XSLT2 中看起来会更好,但无论如何您基本上需要确保要组合在一起的节点最终具有相同的键

<xsl:key name="kGDByIdKey" match="GroupData" use="concat(@ID, '+', @Key)"/>

只有@ID 和@key 相同的事物才会获得相同的使用属性

如果你把它改成

<xsl:key name="kGDByIdKey" match="GroupData[not(@ID='xxx')]" use="concat(@ID, '+', @Key)"/>
<xsl:key name="kGDByIdKey" match="GroupData[@ID='xxx'] use="concat('zzz', '+', @Key)"/>

然后 ID 为 xxx 的节点将使用 zzz 进行索引(并因此分组)(当然,当您从节点构造查找值时,您需要进行类似的更改)

如果您使用的是 xslt 2,您可以使用更简单的函数式样式,当扩展到多个此类更改时可能不会那么笨拙

<xsl:key name="kGDByIdKey" match="GroupData" use="concat(replace(@ID,'^xxx$','zzz'), '+', @Key)"/>

【讨论】:

以上是关于XSLT 分组/合并子项(使用密钥)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Muenchian 分组 XSLT 1.0 在每个目录中按标题分组

使用 XSLT 在 3 列中输出分组列表

XSLT muenchian 在子节点中按值分组

xslt 1.0 使用复合键分组(在不同级别)

使用 XSLT 程序对具有逗号分隔值的 XML 元素进行分组

在 DotNetNuke 表单和列表中使用 XSLT 对项目进行分组