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

XSLT多上下文匹配文本提取KRATE值问题求助

问题:按上下文匹配提取XML对应节点值

源XML

<?xml version="1.0" encoding="UTF-8"?>
<ORDERS05>
    <IDOC BEGIN="1">
        <E1EDP01 SEGMENT="1">
            <E1EDP05 SEGMENT="1">
                <KOTXT>Total item price</KOTXT>
                <KRATE>20.55</KRATE>
            </E1EDP05>
        </E1EDP01>
        <E1EDP01 SEGMENT="1">
            <E1EDP05 SEGMENT="1">
                <KOTXT>Total item price</KOTXT>
                <KRATE>8.03</KRATE>
            </E1EDP05>
        </E1EDP01>
        <E1EDP01 SEGMENT="1">
            <E1EDP05 SEGMENT="1">
                <KOTXT>Total item price</KOTXT>
                <KRATE>99999999</KRATE>
            </E1EDP05>
            <E1EDP05 SEGMENT="1">
                <KOTXT>Total net price</KOTXT>
                <KRATE>9.80</KRATE>
            </E1EDP05>
        </E1EDP01>
        <E1EDP01 SEGMENT="1">
            <E1EDP05 SEGMENT="1">
                <KOTXT>Total item price</KOTXT>
                <KRATE>100000</KRATE>
            </E1EDP05> 
        </E1EDP01>
        <E1EDP01 SEGMENT="1"> 
            <E1EDP05 SEGMENT="1">
                <KOTXT>Total item price</KOTXT>
                <KRATE>10.32</KRATE>
            </E1EDP05>
            <E1EDP05 SEGMENT="1">
                <ALCKZ>-</ALCKZ>
                <KOTXT>Discount</KOTXT>
            </E1EDP05>
            <E1EDP05 SEGMENT="1">
                <KOTXT>Total net price</KOTXT>
                <KRATE>9.80</KRATE>
            </E1EDP05>      
        </E1EDP01>
    </IDOC>
</ORDERS05>

规则说明

遍历每个E1EDP01节点,提取其下E1EDP05节点中KOTXT为Total item price对应的KRATE值,每个E1EDP01对应一条输出行。

现有XSLT代码

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
   <xsl:template match="/">
      <request>
         <import>
            <fields>
               <xsl:for-each select="//E1EDP01">
                  <Line>
                    <UnitPriceGross fid="7053">
                         <xsl:value-of select="//E1EDP05[KOTXT='Total item price']/KRATE"/>
                     </UnitPriceGross>
                  </Line>
               </xsl:for-each>
            </fields>
         </import>
      </request>
   </xsl:template>
</xsl:stylesheet>

当前错误输出

<?xml version="1.0" encoding="UTF-8"?>
<request>
   <import>
      <fields>
         <Line>
            <UnitPriceGross fid="7053">20.55</UnitPriceGross>
         </Line>
         <Line>
            <UnitPriceGross fid="7053">20.55</UnitPriceGross>
         </Line>
         <Line>
            <UnitPriceGross fid="7053">20.55</UnitPriceGross>
         </Line>
         <Line>
            <UnitPriceGross fid="7053">20.55</UnitPriceGross>
         </Line>
         <Line>
            <UnitPriceGross fid="7053">20.55</UnitPriceGross>
         </Line>
      </fields>
   </import>
</request>

期望正确输出

<?xml version="1.0" encoding="UTF-8"?>
<request>
   <import>
      <fields>
         <Line>
            <UnitPriceGross fid="7053">20.55</UnitPriceGross>
         </Line>
         <Line>
            <UnitPriceGross fid="7053">8.03</UnitPriceGross>
         </Line>
         <Line>
            <UnitPriceGross fid="7053">99999999</UnitPriceGross>
         </Line>
         <Line>
            <UnitPriceGross fid="7053">100000</UnitPriceGross>
         </Line>
         <Line>
            <UnitPriceGross fid="7053">10.32</UnitPriceGross>
         </Line>
      </fields>
   </import>
</request>

问题根源

现有代码中xsl:value-of的路径//E1EDP05[KOTXT='Total item price']/KRATE是全局路径,会从整个XML文档的根节点开始查找匹配节点,每次都返回第一个符合条件的KRATE值(即20.55),没有限定在当前循环的E1EDP01节点上下文内。

解决方法与修正代码

将路径改为相对路径,限定在当前E1EDP01节点下查找:

  • 因为E1EDP05是E1EDP01的直接子节点,可直接用E1EDP05[KOTXT='Total item price']/KRATE
  • 如果E1EDP05是深层子节点,可使用.//E1EDP05[KOTXT='Total item price']/KRATE(.代表当前节点)

修正后的XSLT代码:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
   <xsl:template match="/">
      <request>
         <import>
            <fields>
               <xsl:for-each select="//E1EDP01">
                  <Line>
                    <UnitPriceGross fid="7053">
                         <xsl:value-of select="E1EDP05[KOTXT='Total item price']/KRATE"/>
                     </UnitPriceGross>
                  </Line>
               </xsl:for-each>
            </fields>
         </import>
      </request>
   </xsl:template>
</xsl:stylesheet>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 08:12:27