我是xslt的新手,我正在编写一个xslt来替换一个节点的值,其值为某个其他节点。 XML如下,
<Orders>
<Order>
<ShipAddress>
<EMail>a@b.com</EMail>
</ShipAddress>
<OrderData>
<Description>xxxx</Description>
</OrderData>
</Order>
<Order>
......
</Order>
</Orders>
我想为每个订单替换Description with Email的值。我在xslt下创建了转换。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Orders/Order/OrderData/Description/text()">
<xsl:value-of select="../../ShipAddress/EMail"/>
</xsl:template>
</xsl:stylesheet>
但是描述字段没有更新。请告诉我这是什么问题。
答案 0 :(得分:0)
找到问题的解决方案是件好事,但你的结论是错误的。
在xslt中,为了获得祖母,我们应该使用../../../*
不是真的。关键是你实际上正在寻找Description
文本内容的盛大父母,即Order
。 Orders/Order/OrderData/Description/text()
的祖父是OrderData
。但OrderData
小时候没有元素EMail
- 这就是你的方法失败的原因。
下面是一个稍微改进的样式表。它更直接地匹配Description
并使用ancestor::
轴而不是一系列..
。
<强>样式表强>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Description/text()">
<xsl:value-of select="ancestor::Order/ShipAddress/EMail"/>
</xsl:template>
</xsl:stylesheet>
XML输入
<Orders>
<Order>
<ShipAddress>
<EMail>a@b.com</EMail>
</ShipAddress>
<OrderData>
<Description>xxxx</Description>
</OrderData>
</Order>
</Orders>
XML输出
<?xml version="1.0" encoding="utf-8"?>
<Orders>
<Order>
<ShipAddress>
<EMail>a@b.com</EMail>
</ShipAddress>
<OrderData>
<Description>a@b.com</Description>
</OrderData>
</Order>
</Orders>