如何使用XSL修改XML并移除BNF元素
XSL转换实现:移除BNF元素并提取VMP节点
现有如下XML输入:
<BNF_DETAILS xsi:noNamespaceSchemaLocation="bnf_v1_0.xsd" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <!-- Generated by NHSBSA PPD --> <VMPS> <VMP> <VPID>40689311000001106</VPID> <BNF>08010100</BNF> <ATC>L01EL03</ATC> <DDD>320</DDD> <DDD_UOMCD>258684004</DDD_UOMCD> </VMP> <VMP> ... </VMP> </VMPS> <AMPS /> </BNF_DETAILS>
需要转换为以下格式(移除所有<BNF>元素,直接输出每个<VMP>节点):
<VMP> <VPID>40689311000001106</VPID> <ATC>L01EL03</ATC> <DDD>320</DDD> <DDD_UOMCD>258684004</DDD_UOMCD> </VMP> <VMP> ... </VMP>
解决方案XSLT代码
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 移除XML中的空白节点,避免输出多余空格 --> <xsl:strip-space elements="*"/> <!-- 设置XML输出格式,保留缩进 --> <xsl:output method="xml" indent="yes"/> <!-- 匹配根节点,直接定位到需要处理的VMP节点集合 --> <xsl:template match="/BNF_DETAILS"> <xsl:apply-templates select="VMPS/VMP"/> </xsl:template> <!-- 处理每个VMP节点:复制自身,仅保留非BNF的子节点 --> <xsl:template match="VMP"> <VMP> <xsl:apply-templates select="*[not(local-name()='BNF')]"/> </VMP> </xsl:template> <!-- 通用模板:复制所有非BNF的子节点 --> <xsl:template match="*[not(local-name()='BNF')]"> <xsl:copy-of select="."/> </xsl:template> </xsl:stylesheet>
代码说明
<xsl:strip-space elements="*"/>:清理原XML中的空白节点,保证输出格式整洁<xsl:output method="xml" indent="yes"/>:指定输出为XML格式并自动添加缩进,和目标格式一致- 根节点模板:直接跳过其他无关节点(如
AMPS),只处理VMPS下的VMP节点 - VMP节点模板:复制
<VMP>标签,同时过滤掉内部的<BNF>子元素 - 通用子节点模板:自动复制所有非BNF的子节点,无需逐个指定节点名称,扩展性更强
内容的提问来源于stack exchange,提问作者DIamondGeezer
相关产品推荐
相关产品推荐

