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

时间:2017-08-30 19:15:27

标签: xslt xslt-1.0 xslt-2.0

如果Orderitem - &gt; name为“桌面”,则从price value listofspareparts复制name spareparts1 <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> 中的备用2'。

输入:

<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>

输出应为:

<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>

XSLT-1.0:

{{1}}

请告诉我这里缺少的东西。

1 个答案:

答案 0 :(得分:1)

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

你的XPath非常接近,只需要微调一下。看看差异吧。您需要始终考虑相对于事物发展的当前节点 - 这被称为轴。

  

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

<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>

输出符合要求。