使用样式表转换XML:多子元素数据提取异常问题
解决XML中EntityName提取异常及缺失记录问题
核心问题分析
- EntityName字段重复显示Suffix:大概率是XSLT中对EntityName的取值逻辑错误,误将
Suffix节点的值赋给了EntityName字段。 - 无Suffix的Primary Name记录未提取:当前模板的匹配条件可能依赖了
Suffix节点的存在,导致无该节点的记录被过滤。
通用解决方案
假设你的XML结构大致如下(若实际结构不同,需提供具体示例):
<Entity> <Id>123</Id> <Names> <Name> <NameType>Primary</NameType> <EntityName>ABC Corp</EntityName> <!-- 无Suffix节点 --> </Name> <Name> <NameType>Alias</NameType> <EntityName>ABC Limited</EntityName> <Suffix>Limited</Suffix> </Name> </Names> </Entity>
针对该结构,修正后的XSLT需确保:所有<Name>节点都被处理,且明确区分EntityName与Suffix的取值路径。示例代码如下:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="UTF-8"/> <!-- 输出表头 --> <xsl:template match="/"> <xsl:text>Id,NameType,EntityName,Suffix </xsl:text> <xsl:apply-templates select="//Entity/Names/Name"/> </xsl:template> <!-- 处理每个Name节点 --> <xsl:template match="Name"> <!-- 关联父级Entity的Id --> <xsl:value-of select="../../Id"/> <xsl:text>,</xsl:text> <!-- 提取NameType --> <xsl:value-of select="NameType"/> <xsl:text>,</xsl:text> <!-- 明确提取EntityName,避免与Suffix混淆 --> <xsl:value-of select="EntityName"/> <xsl:text>,</xsl:text> <!-- 处理Suffix:存在则取值,否则留空 --> <xsl:choose> <xsl:when test="Suffix"> <xsl:value-of select="Suffix"/> </xsl:when> <xsl:otherwise> <xsl:text></xsl:text> </xsl:otherwise> </xsl:choose> <xsl:text> </xsl:text> </xsl:template> </xsl:stylesheet>
关键修正点
- 移除对
Suffix节点的匹配依赖,确保所有<Name>节点都能被处理 - 明确指定
EntityName的选择路径select="EntityName",避免取值逻辑冲突 - 通过
<xsl:choose>处理Suffix的存在性,无该节点时输出空值,保证记录完整性
若你的XML或当前XSLT结构与上述示例不符,请提供具体代码片段,以便精准调整。
内容的提问来源于stack exchange,提问作者FTM
相关产品推荐
相关产品推荐

