我还没有找到关于在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
&gt;中解析出来。节点和构建的密钥仅使用<order-line
&gt;该特定货件的节点。但相反,我得到三个<shipment
&gt;包含所有<order-line
&gt;的节点文件中的节点。所以似乎在创建密钥时,xml文件总是从根解析?是这样吗?有办法解决这个问题吗?
答案 0 :(得分:4)
你需要定义一个像
这样的键<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
因此,对于分组,您根本不需要密钥。