请求实现:XML中缺失指定wd:Academic_Period的wd:Report_Entry时输出$0.00
嘿,我来帮你搞定这个XML处理的需求——要实现当XML中不存在描述包含“2020 Summer”的wd:Report_Entry节点时输出$0.00,这里有两种实用的解决方案,适配不同的处理场景:
方案1:使用XSLT(适合纯XML转换场景)
XSLT是处理XML转换的标准工具,我们可以通过条件判断来实现需求。下面是完整的XSLT代码:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:wd="urn:com.workday.report/Financial_Aid_Award_Letter"> <xsl:output method="text" encoding="UTF-8"/> <xsl:template match="/"> <!-- 先判断是否存在目标学期的节点 --> <xsl:variable name="hasSummer2020" select="boolean(wd:Report_Data/wd:Report_Entry[wd:Academic_Period/@wd:Descriptor[contains(., '2020 Summer')]])"/> <xsl:choose> <xsl:when test="$hasSummer2020"> <!-- 存在的话,提取金额并格式化为货币形式 --> <xsl:value-of select="concat('$', format-number(wd:Report_Data/wd:Report_Entry[wd:Academic_Period/@wd:Descriptor[contains(., '2020 Summer')]]/wd:Total_Financial_Aid, '0.00'))"/> </xsl:when> <xsl:otherwise> <!-- 不存在的话直接输出$0.00 --> <xsl:text>$0.00</xsl:text> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet>
代码细节说明
- 必须声明和源XML一致的
wd命名空间,不然会找不到对应的节点。 - 用
boolean()函数判断目标节点是否存在,逻辑清晰。 - 当节点存在时,用
format-number()把金额转为两位小数的格式,符合货币展示要求。
用这份XSLT处理你提供的示例XML时,因为存在2020 Summer的节点,会输出$170.00;如果删掉该节点,就会自动输出$0.00。
方案2:使用XPath+编程语言(适合开发场景)
如果你是在Python、Java这类编程语言里处理XML,可以结合XPath查询来实现。比如用Python的lxml库:
from lxml import etree # 你的XML内容 xml_content = """<?xml version='1.0' encoding='UTF-8'?> <wd:Report_Data xmlns:wd="urn:com.workday.report/Financial_Aid_Award_Letter"> <wd:Report_Entry> <wd:Academic_Period wd:Descriptor="2020 Summer (05/26/2020-08/12/2020)"> <wd:ID wd:type="Academic_Period_ID">ACADEMIC_PERIOD_2020_Fall</wd:ID> </wd:Academic_Period> <wd:Total_Financial_Aid>170</wd:Total_Financial_Aid> </wd:Report_Entry> <wd:Report_Entry> <wd:Academic_Period wd:Descriptor="2020 Spring (01/21/2020-05/18/2020)"> <wd:ID wd:type="Academic_Period_ID">ACADEMIC_PERIOD_2020_Spring</wd:ID> </wd:Academic_Period> <wd:Total_Financial_Aid>265</wd:Total_Financial_Aid> </wd:Report_Entry> <wd:Report_Entry> <wd:Academic_Period wd:Descriptor="2020 Summer (05/26/2020-08/12/2020)"> <wd:ID wd:type="Academic_Period_ID">ACADEMIC_PERIOD_2020_Summer</wd:ID> </wd:Academic_Period> <wd:Total_Financial_Aid>170</wd:Total_Financial_Aid> </wd:Report_Entry> </wd:Report_Data>""" # 解析XML tree = etree.fromstring(xml_content.encode('utf-8')) # 定义命名空间 ns = {'wd': 'urn:com.workday.report/Financial_Aid_Award_Letter'} # 查询目标学期的金额 aid_amount = tree.xpath("wd:Report_Data/wd:Report_Entry[wd:Academic_Period/@wd:Descriptor[contains(., '2020 Summer')]]/wd:Total_Financial_Aid", namespaces=ns) # 判断输出 if not aid_amount: print('$0.00') else: # 格式化为两位小数的货币 print(f'${float(aid_amount[0]):.2f}')
这个逻辑很简单:先通过XPath查询是否存在目标节点的金额,如果查询结果为空就输出$0.00,否则格式化输出金额。
内容的提问来源于stack exchange,提问作者Arnab Halder
相关产品推荐
相关产品推荐

