键在 muenchian 分组中的工作原理



我还没有找到关于在 xslt 中进行 muenchian 分组时如何生成密钥的答案。我找到的示例都有非常简单的 xml 文件。给定以下 xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<despatch-advice>
<message-id>2012041715435517181</message-id>
<message-creation>2012-04-17T15:43:55.000+02:00</message-creation>
<originatingFlow>DespatchAdvice</originatingFlow>
<shipment>
    <transport-mode>Sea</transport-mode>
    <transport-id>1111</transport-id>
    <order-line>
        <order>123</order>
        <order-date>2012-01-17+01:00</order-date>
        <selling-code>ME</selling-code>
    </order-line>
</shipment>
<shipment>
    <transport-mode>Sea</transport-mode>
    <transport-id>2222</transport-id>
    <order-line>
        <order>456</order>
        <order-date>2012-01-17+01:00</order-date>
        <selling-code>ME</selling-code>
    </order-line>
    <order-line>
        <order>789</order>
        <order-date>2012-01-17+01:00</order-date>
        <selling-code>ME</selling-code>
    </order-line>
    <order-line>
        <order>832</order>
        <order-date>2012-01-17+01:00</order-date>
        <selling-code>XM</selling-code>
    </order-line>
</shipment>
<shipment>
    <transport-mode>Air</transport-mode>
    <transport-id>333</transport-id>
    <order-line>
        <order>781</order>
        <order-date>2012-01-17+01:00</order-date>
        <selling-code>XM</selling-code>
    </order-line>
    <order-line>
        <order>789</order>
        <order-date>2012-01-17+01:00</order-date>
        <selling-code>XM</selling-code>
    </order-line>
</shipment>

我想做的是将每个货件中每个销售代码的订单行分组。

在我的 xslt 文件中,我按如下方式定义密钥:

<xsl:key name="groups" match="order-line" use="selling-code"/>

在创建了 xml 文件的第一部分后,我执行以下操作:

<xsl:for-each select="order-line[generate-id(.)=generate-id(key('groups',selling-code)[1])]"> 
<ns0:order-line-group>                                      
<xsl:for-each select="key('groups',selling-code)">
<ns0:order-line>

我希望 xml 文件将从当前 <shipment> 节点解析,并且构建的密钥将仅使用该特定货件的<order-line>节点。但相反,我得到了三个<shipment>节点,其中包含文件中的所有<order-line>节点。所以似乎在创建密钥时,xml 文件总是从根目录解析?是吗?有没有办法解决这个问题?

你需要

定义一个键,比如

<xsl:key name="groups" match="order-line" use="concat(generate-id(..), '|', selling-code)"/>

然后你需要使用

<xsl:for-each select="order-line[generate-id(.)=generate-id(key('groups',concat(generate-id(..), '|', selling-code))[1])]"> 
<ns0:order-line-group>                                      
<xsl:for-each select="key('groups',concat(generate-id(..), '|', selling-code))">
<ns0:order-line>

以确保您只处理每个货件的物料。

在 XSLT 2.0 中,key 函数具有第三个参数,用于在子树中查找项目,但 XSLT 1.0 没有该参数,因此您需要将要限制搜索的节点的 id 放在键值中。当然,XSLT 2.0 具有for-each-group因此对于分组,您根本不需要键。

相关内容

  • 没有找到相关文章

最新更新