Biztalk/XSLT映射无关联HL7 OBR与ZCT分段按顺序配对方案咨询
可行解决方案
核心逻辑:所有节点按顺序遍历,以<OBR>节点作为分组起始标记,每个<OBR>和后续出现的第一个<ZCT>为一组映射成<Number>结构,无需依赖关联字段。
方案1:XSLT转换(最适合XML结构化映射场景)
直接用XSLT模板匹配处理顺序节点,示例代码如下:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <!-- 匹配OBR节点作为分组起点 --> <xsl:template match="OBR"> <Number> <One><xsl:value-of select="."/></One> <!-- 取当前OBR之后第一个ZCT节点的内容 --> <Two><xsl:value-of select="following-sibling::ZCT[1]"/></Two> </Number> </xsl:template> <!-- 忽略ZCT节点的单独匹配,避免重复输出 --> <xsl:template match="ZCT"/> </xsl:stylesheet>
使用说明:直接将上述XSLT和你的源XML执行转换即可得到目标结构,适配所有支持XSLT的引擎。
方案2:Python脚本实现(适合自定义逻辑扩展)
用lxml库遍历节点完成分组映射,示例代码如下:
from lxml import etree # 加载源XML source_xml = """<root> <OBR>One</OBR> <ZCT>Two</ZCT> <OBR>Three</OBR> <ZCT>Four</ZCT> </root>""" root = etree.fromstring(source_xml.encode()) # 生成目标XML根节点 target_root = etree.Element("root") current_number = None for node in root.iterchildren(): if node.tag == "OBR": # 遇到OBR开启新的Number组 current_number = etree.SubElement(target_root, "Number") one_ele = etree.SubElement(current_number, "One") one_ele.text = node.text elif node.tag == "ZCT" and current_number is not None: # 遇到ZCT填充到当前Number组 two_ele = etree.SubElement(current_number, "Two") two_ele.text = node.text current_number = None # 输出结果 print(etree.tostring(target_root, pretty_print=True, encoding="unicode"))
使用说明:如果源XML结构有其他嵌套或扩展字段,可以直接修改遍历逻辑适配。
注意事项
- 处理前需要保证源XML的节点顺序严格遵循
OBR -> 对应ZCT -> OBR -> 对应ZCT的规则,避免出现单个OBR后无对应ZCT、或者ZCT出现在OBR之前的异常情况 - 如果存在单个OBR后跟随多个ZCT的场景,可以修改逻辑将多个ZCT合并或者生成多个
<Two>节点即可
内容的提问来源于stack exchange,提问作者navi
相关产品推荐
相关产品推荐

