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

如何提取Order与Customer值?求正确XSLT样式表实现指定输出

问题解决:调整XSLT生成指定结构的XML输出

需求是修改现有XSLT,提取Order节点及其中Customer子节点的相关值(将Order下的CustomerID替换为Customer内的CustomerID),生成符合指定结构的XML输出,而非原代码生成的HTML表格。

输入XML

<Orders>
    <Order>
        <CustomerID>VK</CustomerID>
        <Customer>
            <CompanyName>Vins et alcools Chevalier</CompanyName>
            <Country>France</Country>
            <CustomerID>VINET</CustomerID>
            <City>Reims</City>
            <ContactName>Paul Henriot</ContactName>
            <ContactTitle>Accounting Manager</ContactTitle>
        </Customer>
        <ShipCountry>France</ShipCountry>
        <OrderID>10248</OrderID>
        <EmployeeID>5</EmployeeID>
        <OrderDate>1996-07-04T00:00:00.000</OrderDate>
    </Order>
</Orders>

目标输出XML

<Orders>
    <Order>
        <CustomerID>VINET</CustomerID>
        <CompanyName>Vins et alcools Chevalier</CompanyName>
        <Country>France</Country>
        <CustomerID>VINET</CustomerID>
        <City>Reims</City>
        <ContactName>Paul Henriot</ContactName>
        <ContactTitle>Accounting Manager</ContactTitle>
        <ShipCountry>France</ShipCountry>
        <OrderID>10248</OrderID>
        <EmployeeID>5</EmployeeID>
        <OrderDate>1996-07-04T00:00:00.000</OrderDate>
    </Order>
</Orders>

当前错误的XSLT代码(生成HTML表格,不符合需求)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
            <body>
                <h2>All Orders</h2>
                <table border="1">
                    <tr bgcolor="#003333">
                        <xsl:comment>green</xsl:comment>
                        <th>CUSTOMERID</th>
                        <th>SHIPCOUNTRY</th>
                        <th>ORDERID</th>
                        <th>EMPLOYEEID</th>
                        <th>COMPANYNAME</th>
                        <th>COUNTRY</th>
                        <th>SHIPCOUNTRY</th>
                        <th>CITY</th>
                        <th>CONTACTTITLE</th>
                        <th>ORDERDATE</th>
                    </tr>
                    <xsl:for-each select="Orders/Order">
                        <xsl:sort select="OrderID"/>
                        <tr>
                            <td><xsl:value-of select="CustomerID"/></td>
                            <td><xsl:value-of select="ShipCountry"/></td>
                            <td><xsl:value-of select="OrderID"/></td>
                            <td><xsl:value-of select="EmployeeID"/></td>
                            <td><xsl:value-of select="CompanyName"/></td>
                            <td><xsl:value-of select="Country"/></td>
                            <td><xsl:value-of select="ShipCountry"/></td>
                            <td><xsl:value-of select="City"/></td>
                            <td><xsl:value-of select="ContactTitle"/></td>
                            <td><xsl:value-of select="OrderDate"/></td>
                        </tr>
                    </xsl:for-each>
                </table>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

修正后的XSLT代码

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!-- 身份模板:默认复制所有节点和属性 -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <!-- 替换Order下的CustomerID为Customer子节点内的CustomerID -->
    <xsl:template match="Order/CustomerID">
        <CustomerID>
            <xsl:value-of select="../Customer/CustomerID"/>
        </CustomerID>
    </xsl:template>

    <!-- 移除Customer父节点,直接输出其内部所有子节点 -->
    <xsl:template match="Order/Customer">
        <xsl:apply-templates select="@*|node()"/>
    </xsl:template>
</xsl:stylesheet>

修改说明

  1. 用身份模板保留原XML的基础结构,避免重复编写复制所有节点的代码
  2. 单独匹配Order/CustomerID节点,将值替换为同级Customer里的CustomerID
  3. 匹配Order/Customer节点时,不复制该节点本身,直接输出其内部子节点,实现把Customer下的字段移到Order节点下的效果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 20:27:03