1

我正在尝试优化 xsl,因为修改我的数据需要很长时间。

我的源数据(我无法修改)看起来像:

<catalog>
    <product>
        <prodid>12345</prodid>
        .....
    </proudct>
    <product_group_map>
       <prodid>12345</prodid>
       <groupid>2435</groupid>
    </product_group_map>
</catalog>

我想在产品中使用这些 groupId。到目前为止我所做的看起来像这样:

<xsl:variable name="id"><xsl:value-of select="prodid"/></xsl:variable>

<xsl:variable name="grId">
    <xsl:for-each select="../product_group_map">
        <xsl:if test="prodid = $id">
            <xsl:value-of select="groupid"/>
        </xsl:if>
    </xsl:for-each>
</xsl:variable>

<!-- the actual print of the values -->
<xsl:value-of select="concat( $id, $separator, $grId)"/>

所以这个过程运行 O^2。对于 700 万种产品来说,这是不行的。有没有办法以其他方式匹配所需的 groupId ?我想到了类似的东西:如果 xml 看起来像这样

<catalog>
    <product>
        <prodid>12345</prodid>
        .....
    </proudct>
    <product_group_map prodId="12345">
       <groupid>2435</groupid>
    </product_group_map>
</catalog>

我可以像这样使用选择:

<!--allready in product with the path -->
<xsl:variable name="id"><xsl:value-of select="prodid"/></xsl:variable>
<xsl:variable name="groupid"><xsl:value-of select="../product_group_map[@prodid = $prodId]/groupid"/></xsl:variable>
4

1 回答 1

2

首先,xsl:variable仅包含 a是低效的value-of,最好将 select 表达式放在xsl:variable自身上。其次,您可以使用当前设置对属性执行相同的prodid操作

<xsl:variable name="groupid" select="../product_group_map[prodid = $id]/groupid" />

但是定义一个键可能更有效(在任何模板之外)

<xsl:key name="groupByProduct" match="prod_group_map/groupid" use="../prodid" />

然后你可以简单地使用找到组ID

<xsl:variable name="groupid" select="key('groupByProduct', $id)" />

请注意,如果相同prodid的元素通过不同的元素链接到几个不同的组 id product_group_map,那么结果$groupid变量将是一个包含所有匹配groupid元素的节点集。

于 2013-06-27T15:12:43.503 回答