XSLT 2.0分组问题:无索引logisticsFlatRate段处理与结构转换
问题描述
需将输入XML转换为指定的扁平结构,现有XSLT 2.0代码无法正确关联无index字段的logisticsFlatRate到对应分组,同时Currency字段的提取逻辑缺失。
期望输出XML
<?xml version="1.0" encoding="UTF-8"?> <Response> <Responses> <index>000010</index> <brutto>246.09</brutto> <bruttoSingle>246.09</bruttoSingle> <netto>7327.14</netto> <nettoSingle>244.24</nettoSingle> <logisticsFlatRateValue>18.27</logisticsFlatRateValue> <logisticsFlatRatePercentage>0.25</logisticsFlatRatePercentage> <Currency>USD</Currency> </Responses> <Responses/> <Responses> <index>000020</index> <brutto>10.20</brutto> <bruttoSingle>10.20</bruttoSingle> <netto>2.88</netto> <nettoSingle>2.88</nettoSingle> <logisticsFlatRateValue>15.27</logisticsFlatRateValue> <logisticsFlatRatePercentage>0.45</logisticsFlatRatePercentage> <Currency>USD</Currency> </Responses> <Responses/> </Response>
输入XML
<?xml version="1.0" encoding="UTF-8"?> <Response> <Responses> <brutto> <indx>000010</indx> <value>246.09</value> <currency>USD</currency> </brutto> <bruttoSingle> <indx>000010</indx> <value>246.09</value> <currency>USD</currency> </bruttoSingle> <logisticsFlatRate> <value>18.27</value> <percentage>0.25</percentage> </logisticsFlatRate> </Responses> <Responses> <netto> <indx>000010</indx> <value>7327.14</value> <currency>USD</currency> </netto> <nettoSingle> <indx>000010</indx> <value>244.24</value> <currency>USD</currency> </nettoSingle> </Responses> <Responses/> <Responses> <brutto> <indx>000020</indx> <value>10.20</value> <currency>USD</currency> </brutto> <bruttoSingle> <indx>000020</indx> <value>10.20</value> <currency>USD</currency> </bruttoSingle> </Responses> <Responses> <netto> <indx>000020</indx> <value>2.88</value> <currency>USD</currency> </netto> <nettoSingle> <indx>000020</indx> <value>2.88</value> <currency>USD</currency> </nettoSingle> <logisticsFlatRate> <value>15.27</value> <percentage>0.45</percentage> </logisticsFlatRate> </Responses> <Responses/> </Response>
现有XSLT代码及问题
现有代码无法将logisticsFlatRate关联到对应index的分组,且未处理Currency字段提取:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <xsl:template match="/"> <xsl:for-each-group select="//Responses/*[index]" group-by="index"> <group> <index><xsl:value-of select="current-grouping-key()"/></index> <items> <xsl:for-each select="current-group()"> <xsl:element name="{name()}"> <xsl:value-of select="value"/> </xsl:element> </xsl:for-each> <xsl:for-each select="/Response/Responses/logisticsFlatRate"> <xsl:copy-of select="."/> </xsl:for-each> </items> </group> </xsl:for-each-group> </xsl:template> </xsl:stylesheet>
解决方案XSLT 2.0
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <xsl:template match="/Response"> <Response> <!-- 按唯一indx值分组 --> <xsl:for-each-group select=".//*[indx]" group-by="indx"> <xsl:variable name="currentIndx" select="current-grouping-key()"/> <Responses> <index><xsl:value-of select="$currentIndx"/></index> <!-- 输出各字段的value值 --> <xsl:for-each select="current-group()"> <xsl:element name="{name()}"> <xsl:value-of select="value"/> </xsl:element> </xsl:for-each> <!-- 关联对应indx的logisticsFlatRate并转换为扁平结构 --> <xsl:for-each select=".//Responses[*[indx = $currentIndx]]/logisticsFlatRate"> <logisticsFlatRateValue><xsl:value-of select="value"/></logisticsFlatRateValue> <logisticsFlatRatePercentage><xsl:value-of select="percentage"/></logisticsFlatRatePercentage> </xsl:for-each> <!-- 提取Currency字段 --> <Currency><xsl:value-of select="current-group()[1]/currency"/></Currency> </Responses> <!-- 输出空Responses节点 --> <Responses/> </xsl:for-each-group> </Response> </xsl:template> </xsl:stylesheet>
核心逻辑说明
- 分组方式:通过
.//*[indx]选择所有含indx的节点,按indx值分组,确保同一index的所有字段聚合。 - logisticsFlatRate关联:通过
.//Responses[*[indx = $currentIndx]]定位包含当前indx的Responses节点,从中提取logisticsFlatRate的子节点并转换为扁平字段。 - Currency提取:取当前分组第一个节点的
currency值(假设同一index下货币一致)。 - 结构对齐:每个分组对应一个
Responses节点,后跟空Responses节点,匹配期望输出格式。
内容的提问来源于stack exchange,提问作者jimboextended
相关产品推荐
相关产品推荐

