XSLT根据父节点和子节点中的条件将子节点值复制到父节点



如果Orderitem->name是"Desktop",则从listofspareparts中的value复制price,其中namespareparts1中的"spare2"。

输入:

<listoforders>
<Orderitem>
<name>Desktop</name>
<place>NZ</place>
<price>120</price>
<listofspareparts>
<spareparts1>
<name>spare1</name>
<value>140</value>
</spareparts1>
<spareparts1>
<name>spare2</name>
<value>130</value>
</spareparts1>            
</listofspareparts>
</orderitem>
</listoforders>

输出应为:

<listoforders>
<Orderitem>
<name>Desktop</name>
<place>NZ</place>
<price>130</price>
<listofspareparts>
<spareparts1>
<name>spare1</name>
<value>140</value>
</spareparts1>
<spareparts1>
<name>spare2</name>
<value>130</value>
</spareparts1>                
</listofspareparts>
</orderitem>
</listoforders>

XSLT-1.0:

<xsl:stylesheet version="1.0" xmlns:xsl="w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/>    
<xsl:strip-space elements=""/>
<xsl:template match="node()|@">         
<xsl:copy>             
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="price[../Orderitem[name='Desktop']"> 
<xsl:copy-of select="value[../../listofspareparts/spareparts1[name='spare‌​2']]" />
</xsl:template>
</xsl:stylesheet>

请让我知道我在这里缺了什么。

首先,您的XML格式不正确,因为<Orderitem></orderitem>不一致。所以我选择将这个元素命名为<Orderitem>

您的XPaths非常接近,只需要进行一点微调。看看差异就知道了。您需要始终考虑当前节点,即所谓的轴。

轴定义相对于当前节点的节点集。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/>    
<xsl:strip-space elements="*"/>
<xsl:template match="node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="price[../name='Desktop']"> 
<price>
<xsl:value-of select="../listofspareparts/spareparts1[name='spare2']/value" />
</price>
</xsl:template>
</xsl:stylesheet>

输出符合要求。

最新更新