2

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

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

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

使用@Dimitre Novatchev 解决方案,我设法将它们组合到一个节点中。

所以如果我有:

<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 或其他方法)。

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

4

1 回答 1

0

我猜这是 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)"/>
于 2013-01-03T02:24:36.090 回答