XSLT迭代XML节点提取指定字段并生成SQL插入语句求助
解决XSLT转换中无法获取VORNR字段生成SQL插入语句的问题
问题分析
- 迭代提取XML中的
AUFNR、BDMNG、MATNR、MEINS、VORNR字段生成SQL插入语句时,VORNR字段无法正确获取,导致输出SQL不符合预期。 - 核心原因:VORNR的XPath定位路径错误,未正确关联到其所在的父层级节点。
模拟场景示例
示例XML结构
<ProductionOrder> <AUFNR>1000001</AUFNR> <Operations> <Operation> <VORNR>0010</VORNR> <Components> <Component> <MATNR>MAT001</MATNR> <BDMNG>10.0</BDMNG> <MEINS>PC</MEINS> </Component> <Component> <MATNR>MAT002</MATNR> <BDMNG>5.0</BDMNG> <MEINS>KG</MEINS> </Component> </Components> </Operation> <Operation> <VORNR>0020</VORNR> <Components> <Component> <MATNR>MAT003</MATNR> <BDMNG>3.0</BDMNG> <MEINS>M</MEINS> </Component> </Components> </Operation> </Operations> </ProductionOrder>
错误的XSLT代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" /> <xsl:template match="/"> <xsl:for-each select="ProductionOrder/Operations/Operation/Components/Component"> INSERT INTO production_order_components (AUFNR, VORNR, MATNR, BDMNG, MEINS) VALUES ('<xsl:value-of select="../../../AUFNR"/>', '<xsl:value-of select="VORNR"/>', '<xsl:value-of select="MATNR"/>', '<xsl:value-of select="BDMNG"/>', '<xsl:value-of select="MEINS"/>'); <xsl:text> </xsl:text> </xsl:for-each> </xsl:template> </xsl:stylesheet>
错误点:select="VORNR"试图从当前Component节点直接获取VORNR,但该节点下无此字段,需向上回溯到Operation节点。
修正后的XSLT代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="UTF-8" /> <xsl:template match="/"> <!-- 遍历每个组件,关联对应的工单和工序 --> <xsl:for-each select="ProductionOrder/Operations/Operation/Components/Component"> <!-- 定义变量存储关联字段,提升可读性 --> <xsl:variable name="currentAufnr" select="../../../AUFNR" /> <xsl:variable name="currentVornr" select="ancestor::Operation/VORNR" /> <xsl:text>INSERT INTO production_order_components (AUFNR, VORNR, MATNR, BDMNG, MEINS) VALUES ('</xsl:text> <xsl:value-of select="$currentAufnr" /> <xsl:text>', '</xsl:text> <xsl:value-of select="$currentVornr" /> <xsl:text>', '</xsl:text> <xsl:value-of select="MATNR" /> <xsl:text>', '</xsl:text> <xsl:value-of select="BDMNG" /> <xsl:text>', '</xsl:text> <xsl:value-of select="MEINS" /> <xsl:text>'); </xsl:text> </xsl:for-each> </xsl:template> </xsl:stylesheet>
关键修正:
- 使用
ancestor::Operation/VORNR定位到当前组件所属的工序节点中的VORNR字段,确保路径正确 - 引入变量存储字段值,提升代码可读性和维护性
预期输出SQL
INSERT INTO production_order_components (AUFNR, VORNR, MATNR, BDMNG, MEINS) VALUES ('1000001', '0010', 'MAT001', '10.0', 'PC'); INSERT INTO production_order_components (AUFNR, VORNR, MATNR, BDMNG, MEINS) VALUES ('1000001', '0010', 'MAT002', '5.0', 'KG'); INSERT INTO production_order_components (AUFNR, VORNR, MATNR, BDMNG, MEINS) VALUES ('1000001', '0020', 'MAT003', '3.0', 'M');
内容的提问来源于stack exchange,提问作者charj
相关产品推荐
相关产品推荐

