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
相关产品推荐
相关产品推荐

