XSLT 1.0转换XML:同记录多值无法正确返回的问题求助
解决XSLT 1.0处理多NameValue节点的行缺失与字段匹配问题
问题背景
使用XSLT 1.0转换XML数据时遇到以下问题:
- 仅包含单个
NameValue的NameType(如Primary Name、Formerly Known As)转换正常 - 包含多个
NameValue的NameType(如Also Known As、Spelling Variation)仅返回单条记录,缺失其余行 - Spelling Variation类型中,
CarName与Suffix来自不同的NameValue,数据匹配错误(应保持同一NameValue内的字段对应关系)
现有XSLT 1.0样式表
<xsl:stylesheet version = "1.0" xmlns="http://<redacted>" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://www.w3.org/2005/02/xpath-functions"> <xsl:output method="xml"/> <xsl:output method="xml" indent="yes"/> <xsl:template match="/PFA"> <data> <record skip="true"> <value name="Id" type="string"/> <value name="NameType" type="string"/> <value name="Suffix" type="string"/> <value name="CarName" type="string"/> </record> <xsl:apply-templates select="Records/Car"/> </data> </xsl:template> <xsl:template match="Car"> <xsl:apply-templates select="NameDetails/Name"> <xsl:with-param name="id" select="@id"/> </xsl:apply-templates> </xsl:template> <xsl:template match="Name"> <xsl:param name="id"/> <record> <value name="Id"> <xsl:value-of select="$id"/> </value> <value name="NameType"> <xsl:value-of select="@NameType"/> </value> <value name="Suffix"> <xsl:value-of select="NameValue/Suffix"/> </value> <value name="CarName"> <xsl:value-of select="NameValue/CarName"/> </value> </record> </xsl:template> </xsl:stylesheet>
源XML结构
<?xml version="1.0" encoding="UTF-8"?> <PFA date="202410281000" type="full"> <Records> <Car id="1023956" action="add" date="26-Feb-2024"> <NameDetails> <Name NameType="Primary Name"> <NameValue> <CarName>Porsche 911 Turbo</CarName> </NameValue> </Name> <Name NameType="Also Known As"> <NameValue> <Suffix>Turbo</Suffix> <CarName>Neunelf</CarName> </NameValue> <NameValue> <Suffix>GT1</Suffix> <CarName>Porsche AG 911</CarName> </NameValue> </Name> <Name NameType="Formerly Known As"> <NameValue> <Suffix>356</Suffix> <CarName>Porsche</CarName> </NameValue> </Name> <Name NameType="Spelling Variation"> <NameValue> <CarName>Porshe 911</CarName> </NameValue> <NameValue> <Suffix>Turbo</Suffix> <CarName>911</CarName> </NameValue> </Name> </NameDetails> </Car> </Records> </PFA>
修正后的XSLT 1.0样式表
<xsl:stylesheet version = "1.0" xmlns="http://<redacted>" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://www.w3.org/2005/02/xpath-functions"> <xsl:output method="xml" indent="yes"/> <xsl:template match="/PFA"> <data> <record skip="true"> <value name="Id" type="string"/> <value name="NameType" type="string"/> <value name="Suffix" type="string"/> <value name="CarName" type="string"/> </record> <xsl:apply-templates select="Records/Car"/> </data> </xsl:template> <xsl:template match="Car"> <!-- 直接遍历每个Name下的NameValue,传递id和NameType参数 --> <xsl:apply-templates select="NameDetails/Name/NameValue"> <xsl:with-param name="carId" select="@id"/> <xsl:with-param name="nameType" select="../@NameType"/> </xsl:apply-templates> </xsl:template> <xsl:template match="NameValue"> <xsl:param name="carId"/> <xsl:param name="nameType"/> <record> <value name="Id"> <xsl:value-of select="$carId"/> </value> <value name="NameType"> <xsl:value-of select="$nameType"/> </value> <value name="Suffix"> <xsl:value-of select="Suffix"/> </value> <value name="CarName"> <xsl:value-of select="CarName"/> </value> </record> </xsl:template> </xsl:stylesheet>
修正说明
- 核心逻辑调整:将原模板中针对
<Name>节点生成单条记录的逻辑,改为直接遍历每个<NameValue>节点,确保每个NameValue对应一条独立的<record> - 参数传递优化:在遍历
NameValue时,直接传递父节点的carId和nameType参数,避免跨节点取值错误 - 字段取值修正:
Suffix和CarName直接取自当前NameValue节点,确保同节点内的字段对应关系正确 - 冗余输出配置清理:移除重复的
<xsl:output>配置
内容的提问来源于stack exchange,提问作者FTM
相关产品推荐
相关产品推荐

