如何提取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>
修改说明
- 用身份模板保留原XML的基础结构,避免重复编写复制所有节点的代码
- 单独匹配
Order/CustomerID节点,将值替换为同级Customer里的CustomerID - 匹配
Order/Customer节点时,不复制该节点本身,直接输出其内部子节点,实现把Customer下的字段移到Order节点下的效果
内容的提问来源于stack exchange,提问作者Kas
相关产品推荐
相关产品推荐

