You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XSLT使用Key/Template查询外部源异常:输入1214未得ZL99

XSLT查询销售组织1214未返回预期值ZL99问题排查

被查询的XML源文档

<?xml version="1.0"?>
<Generic>
    <SalesOrgProperties_HashMap>
        <item key="1003" value="3660,00,C0"/>
        <item key="1005" value="3670,00,L0"/>
        <item key="1214" value="4200,00,L0"/>
    </SalesOrgProperties_HashMap>
    <CondType_PriceListDiscount_HashMap>
        <item key="1003" value="ZL99"/>
        <item key="1005" value="ZL99"/>
        <item key="1214" value="ZL99"/>
        <item key="1227" value="ZL99"/>
    </CondType_PriceListDiscount_HashMap>
    <CondType_NetAmount_HashMap>
        <item key="1003" value="ZAF2"/>
        <item key="1005" value="ZAF2"/>
        <item key="1214" value="ZPVP"/>
        <item key="1227" value="ZAF2"/>
    </CondType_NetAmount_HashMap>
    <CondType_GrossPrice_HashMap>
        <!--<item key="1003" value="ZHTI"/>-->
        <item key="1005" value="ZHTI"/>
        <item key="1214" value="ZHTI"/>
        <item key="1227" value="ZHTI"/>
    </CondType_GrossPrice_HashMap>
</Generic>

XSLT键与变量定义

<xsl:key name="SO_ReplaceFunction" match="item" use="@key"/>
<xsl:variable name="SO_Properties" select="document($LookupDocument)/Generic/SalesOrgProperties_HashMap"/>
<xsl:key name="CondType_PriceListDiscount_ReplaceFunction" match="item" use="@key"/>
<xsl:variable name="CondType_PriceListDiscount_Properties" select="document($LookupDocument)/Generic/CondType_PriceListDiscount_HashMap"/>
<xsl:key name="CondType_NetAmount_ReplaceFunction" match="item" use="@key"/>
<xsl:variable name="CondType_NetAmount_Properties" select="document($LookupDocument)/Generic/CondType_NetAmount_HashMap"/>
<xsl:key name="CondType_GrossPrice_ReplaceFunction" match="item" use="@key"/>
<xsl:variable name="CondType_GrossPrice_Properties" select="document($LookupDocument)/Generic/CondType_GrossPrice_HashMap"/>

模板定义

<xsl:template match="SalesOrgProperties_HashMap">
    <xsl:param name="valueToLookup"/>
    <xsl:value-of select="key('SO_ReplaceFunction', $valueToLookup)/@value"/>
</xsl:template>
<xsl:template match="CondType_PriceListDiscount_HashMap">
    <xsl:param name="valueToLookup"/>
    <xsl:value-of select="key('CondType_PriceListDiscount_ReplaceFunction', $valueToLookup)/@value"/>
</xsl:template>
<xsl:template match="CondType_NetAmount_HashMap">
    <xsl:param name="valueToLookup"/>
    <xsl:value-of select="key('CondType_NetAmount_ReplaceFunction', $valueToLookup)/@value"/>
</xsl:template>
<xsl:template match="CondType_GrossPrice_HashMap">
    <xsl:param name="valueToLookup"/>
    <xsl:value-of select="key('CondType_GrossPrice_ReplaceFunction', $valueToLookup)/@value"/>
</xsl:template>

调用示例

<xsl:apply-templates select="$CondType_PriceListDiscount_Properties">
    <xsl:with-param name="valueToLookup" select="$salesOrg"/>
</xsl:apply-templates>

问题原因

你定义的<xsl:key>默认会在定义该key的文档上下文(即主输入文档)中匹配item节点,但你通过document($LookupDocument)获取的是外部文档中的HashMap节点,模板执行时的上下文是外部文档的节点,此时key()函数仍然只会在主文档中查找匹配的item,而非外部文档,因此找不到销售组织1214对应的ZL99值。

解决方案

方案1:直接在当前上下文节点中查找(无需key)

修改模板中的<xsl:value-of>语句,直接在当前HashMap节点下定位对应的item:

<xsl:template match="CondType_PriceListDiscount_HashMap">
    <xsl:param name="valueToLookup"/>
    <xsl:value-of select="./item[@key=$valueToLookup]/@value"/>
</xsl:template>

其他模板可按同样逻辑修改。

方案2:使用XSLT 2.0+的key第三个参数指定上下文文档

如果你的XSLT处理器支持2.0及以上版本,可以在调用key()时传入第三个参数,指定要查找的节点集:

<xsl:template match="CondType_PriceListDiscount_HashMap">
    <xsl:param name="valueToLookup"/>
    <xsl:value-of select="key('CondType_PriceListDiscount_ReplaceFunction', $valueToLookup, $CondType_PriceListDiscount_Properties)/@value"/>
</xsl:template>

该参数会告诉key()函数在指定的外部文档节点集中查找匹配的item。


内容的提问来源于stack exchange,提问作者Srii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 20:24:51