You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>

修正说明

  1. 核心逻辑调整:将原模板中针对<Name>节点生成单条记录的逻辑,改为直接遍历每个<NameValue>节点,确保每个NameValue对应一条独立的<record>
  2. 参数传递优化:在遍历NameValue时,直接传递父节点的carId和nameType参数,避免跨节点取值错误
  3. 字段取值修正:Suffix和CarName直接取自当前NameValue节点,确保同节点内的字段对应关系正确
  4. 冗余输出配置清理:移除重复的<xsl:output>配置

内容的提问来源于stack exchange,提问作者FTM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 23:32:01