基于UTENTE和ESERCIZIO匹配,批量填充esercizi.xml的MASSIMALE字段
需求说明
- 从
massimali.xml中提取MASSIMALE字段值,填充到esercizi.xml中所有UTENTE与ESERCIZIO字段均匹配的<massimale>标签内 - 此前方案仅能填充首个匹配条目,无法覆盖同一用户同一训练项目的所有对应行
示例效果
<?xml version="1.0"?> <sessioni> <sessione position="1"> <id>1739616101355231</id> <index>1</index> <nome_sessione>3</nome_sessione> <utente>USER1</utente> <!-- 与massimali.xml中的USER1匹配 --> <esercizio>BENCH PRESS</esercizio> <!-- 与massimali.xml中的训练项目匹配 --> <rep_sessione>1</rep_sessione> <percent_sessione>50</percent_sessione> <massimale>100</massimale> <!-- 从massimali.xml加载的值 -->
附文件内容
esercizi.xml
<?xml version="1.0"?> <sessioni> <sessione position="1"> <id>1739616101355231</id> <index>1</index> <nome_sessione>3</nome_sessione> <utente>USER1</utente> <esercizio>BENCH PRESS</esercizio> <rep_sessione>1</rep_sessione> <percent_sessione>50</percent_sessione> <massimale/> </sessione> <sessione position="2"> <id>1739616101355231</id> <index>2</index> <nome_sessione>3</nome_sessione> <utente>USER1</utente> <esercizio>BENCH PRESS</esercizio> <rep_sessione>1</rep_sessione> <percent_sessione>65</percent_sessione> <massimale/> </sessione> <sessione position="3"> <id>1739616101355231</id> <index>3</index> <nome_sessione>3</nome_sessione> <utente>USER1</utente> <esercizio>BENCH PRESS</esercizio> <rep_sessione>1</rep_sessione> <percent_sessione>75</percent_sessione> <massimale/> </sessione> <sessione position="4"> <id>1739616101355231</id> <index>4</index> <nome_sessione>3</nome_sessione> <utente>USER1</utente> <esercizio>BENCH PRESS</esercizio> <rep_sessione>1</rep_sessione> <percent_sessione>80</percent_sessione> <massimale/> </sessione> <sessione position="5"> <id>1739720496368387</id> <index>5</index> <nome_sessione>1</nome_sessione> <utente>USER2</utente> <esercizio>BACK SQUAT</esercizio> <rep_sessione>1</rep_sessione> <percent_sessione>65</percent_sessione> <massimale/> </sessione> <sessione position="6"> <id>1739720496368387</id> <index>6</index> <nome_sessione>1</nome_sessione> <utente>USER2</utente> <esercizio>BACK SQUAT</esercizio> <rep_sessione>1</rep_sessione> <percent_sessione>75</percent_sessione> <massimale/> </sessione> <sessione position="7"> <id>1739720496368387</id> <index>7</index> <nome_sessione>1</nome_sessione> <utente>USER2</utente> <esercizio>BACK SQUAT</esercizio> <rep_sessione>1</rep_sessione> <percent_sessione>85</percent_sessione> <massimale/> </sessione> </sessioni>
massimali.xml
<?xml version="1.0"?> <massimali> <atleta position="1"> <id>1739616101355231</id> <utente>USER1</utente> <esercizio>BENCH PRESS</esercizio> <massimale>100</massimale> <data>2022-07-30</data> </atleta> <atleta position="2"> <id>1739720496368387</id> <utente>USER1</utente> <esercizio>BACK SQUAT</esercizio> <massimale>80</massimale> <data>2022-07-30</data> </atleta> <atleta position="3"> <id>1739720496368387</id> <utente>USER2</utente> <esercizio>BACK SQUAT</esercizio> <massimale>100</massimale> <data>2022-07-30</data> </atleta> <atleta position="4"> <id>1739616101355231</id> <utente>USER2</utente> <esercizio>BENCH PRESS</esercizio> <massimale>95</massimale> <data>2022-07-30</data> </atleta> </massimali>
解决方案
用XSLT处理这类XML数据匹配和填充是最直接的方式,以下是能实现批量填充所有匹配条目的脚本:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 复制原文档所有未修改的内容 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 处理esercizi.xml中的空massimale标签 --> <xsl:template match="massimale[not(node())]"> <massimale> <!-- 从massimali.xml匹配对应用户和训练项目的最大值 --> <xsl:value-of select="document('massimali.xml')/massimali/atleta[utente=../../utente and esercizio=../../esercizio]/massimale"/> </massimale> </xsl:template> </xsl:stylesheet>
执行步骤
- 把上面的XSLT代码保存为
fill_massimale.xsl文件 - 用任意XSLT处理器执行转换,比如用Saxon的命令行:
java -jar saxon-he-12.4.jar -s:esercizi.xml -xsl:fill_massimale.xsl -o:esercizi_updated.xml
这个脚本会遍历esercizi.xml中所有条目,只要用户(utente)和训练项目(esercizio)与massimali.xml中的条目匹配,就会把对应的最大值填充到<massimale>标签里,不会遗漏任何匹配行。
内容的提问来源于stack exchange,提问作者ste
相关产品推荐
相关产品推荐

