根据下面的输入xml,如果orderitem在父级别为“桌面”类型,则更新所有子订单的价格与父价格相同。 orderitem是递归的,里面可以有1-n个orderitems。对于简单性,我考虑了3个孩子和1个父母的命令。 我还有另一个涉及依赖性的问题,即如果父母有一个objectid并且它匹配孩子的objectid然后更新价格。但是,一旦这个问题得到解决,我会问一个新问题。谢谢。
<listoforders>
<Orderitem>
<name>Desktop</name>
<place>NZ</place>
<price>120</price>
<Orderitem>
<name>Desktop2</name>
<place>NZ</place>
<price>130</price>
</Orderitem>
<Orderitem>
<name>Desktop3</name>
<place>NZ</place>
<price>130</price>
</Orderitem>
</Orderitem>
</listoforders>
结果:
<listoforders>
<Orderitem>
<name>Desktop</name>
<place>NZ</place>
<price>120</price>
<Orderitem>
<name>Desktop2</name>
<place>NZ</place>
<price>120</price>
</Orderitem>
<Orderitem>
<name>Desktop3</name>
<place>NZ</place>
<price>120</price>
</Orderitem>
</Orderitem>
</listoforders>
看似简单,但我无法通过身份规则来做到这一点。我需要在这里使用吗?
<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="orderitem[name='Desktop']/price">
<xsl:variable name="temp" select="*[(self::price)]"/>
<xsl:copy>
<xsl:value-of select=$temp </xsl:value-of>
<xsl:apply-templates select="*[(child::price)]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
提前致谢。
此致 Krish
答案 0 :(得分:0)
怎么样:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="price[../../name='Desktop']">
<xsl:copy-of select="../../price"/>
</xsl:template>
</xsl:stylesheet>