XSLT 2.0 替换包含指定字符、为空或不存在的元素值的方法
XML SubModel字段标准化转换方案
以下两种实现均完整覆盖你提出的转换规则:SubModel存在且内容非空、非-则保留原值,其余所有情况统一输出为NA。如果你的规则中需要额外将下划线_也判定为无效值,只需要在对应方案的判断条件中加入对应取值的匹配即可。
方案1:XSLT 1.0 实现(通用XML转换方案,兼容所有支持XSLT的工具/语言)
XSLT是XML结构化转换的原生标准方案,无需额外编码即可通过各类XSLT工具直接执行:
<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> <!-- 处理Vehicle节点下的SubModel字段 --> <xsl:template match="Vehicle"> <xsl:copy> <!-- 复制Vehicle下除了SubModel之外的所有现有节点 --> <xsl:apply-templates select="*[not(local-name()='SubModel')]"/> <!-- 生成标准化的SubModel字段 --> <SubModel> <xsl:choose> <!-- 符合有效值的情况:SubModel存在,且内容不是空、不是'-' --> <xsl:when test="SubModel and normalize-space(SubModel) != '' and normalize-space(SubModel) != '-'"> <xsl:value-of select="normalize-space(SubModel)"/> </xsl:when> <!-- 其余情况统一输出NA --> <xsl:otherwise>NA</xsl:otherwise> </xsl:choose> </SubModel> </xsl:copy> </xsl:template> </xsl:stylesheet>
使用时仅需通过任意支持XSLT的工具(如xsltproc、Java内置XSLT引擎、Python lxml库)加载上述样式表和输入XML,即可直接输出符合要求的结果。
方案2:Python 原生实现(适合集成到Python业务流程)
基于Python标准库xml.etree.ElementTree实现,无需额外安装第三方依赖:
import xml.etree.ElementTree as ET def standardize_submodel(xml_str): root = ET.fromstring(xml_str) # 遍历所有Vehicle节点 for vehicle in root.findall(".//Vehicle"): submodel_elem = vehicle.find("SubModel") submodel_val = None if submodel_elem is not None: submodel_val = submodel_elem.text.strip() if submodel_elem.text else "" # 判断是否需要替换为NA if submodel_elem is None or submodel_val in ("", "-"): # 移除原有SubModel节点(如果存在) if submodel_elem is not None: vehicle.remove(submodel_elem) # 新增值为NA的SubModel节点,放在Model节点之后保持结构一致 model_pos = list(vehicle).index(vehicle.find("Model")) new_submodel = ET.Element("SubModel") new_submodel.text = "NA" vehicle.insert(model_pos + 1, new_submodel) else: # 保留有效值,自动去掉首尾空格 submodel_elem.text = submodel_val # 转换为字符串返回 return ET.tostring(root, encoding="unicode", xml_declaration=False)
调用时传入输入XML字符串即可直接得到转换后的结果。
内容的提问来源于stack exchange,提问作者SupposedlySleeping
相关产品推荐
相关产品推荐

