如何使用XSLT仅替换首个OrderDetail标签为baz?
只替换第一个
<OrderDetail>标签的XSLT解决方案 要实现只替换第一个出现的<OrderDetail>标签,咱们只需要调整现有XSLT的匹配规则,精准定位到第一个目标节点即可,其他节点会自动保留原有结构。
修改后的XSLT代码
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0"> <xsl:output indent="yes"/> <!-- 身份转换模板:复制所有未被特殊模板匹配的节点,保证整体结构不变 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 仅匹配父节点下的第一个OrderDetail,替换为baz标签 --> <xsl:template match="OrderDetail[1]"> <baz> <xsl:apply-templates/> </baz> </xsl:template> </xsl:stylesheet>
关键改动说明
- 把原来匹配所有
<OrderDetail>的模板,修改为匹配OrderDetail[1]——这个XPath表示当前父节点下的第一个<OrderDetail>节点,精准命中第一个目标标签。 - 其余的
<OrderDetail>节点会被默认的身份转换模板原样复制,不会被修改。
转换后的结果
<?xml version="1.0" encoding="UTF-8"?> <Order OrderID="10613"> <CustomerID>HILAA</CustomerID> <EmployeeID>4</EmployeeID> <OrderDate>1997-07-29T05:38:16</OrderDate> <RequiredDate>1997-08-26T11:38:15</RequiredDate> <ShippedDate>1997-08-01T12:46:12</ShippedDate> <ShipVia>2</ShipVia> <Freight>8.1100</Freight> <ShipName>HILARION-Abastos</ShipName> <ShipAddress>Carrera 22 con Ave. Carlos Soublette #8-35</ShipAddress> <ShipCity>San Cristóbal</ShipCity> <ShipRegion>Táchira</ShipRegion> <ShipPostalCode>5022</ShipPostalCode> <ShipCountry>Venezuela</ShipCountry> <OrderDetails> <baz> <ProductID>13</ProductID> <UnitPrice>6.0000</UnitPrice> <Quantity>8</Quantity> <Discount>0.1</Discount> </baz> <OrderDetail> <ProductID>75</ProductID> <UnitPrice>7.7500</UnitPrice> <Quantity>40</Quantity> <Discount>0</Discount> </OrderDetail> </OrderDetails> </Order>
可以看到,第一个<OrderDetail>已经被替换为<baz>,第二个则保持原有标签不变,完全符合需求。
内容的提问来源于stack exchange,提问作者Nicholas Saunders
相关产品推荐
相关产品推荐

