如果Orderitem
->name
是"Desktop",则从listofspareparts
中的value
复制price
,其中name
是spareparts1
中的"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='spare2']]" />
</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>
输出符合要求。