2017-08-30 26 views
0

如果Orderitem - >name是“桌面”,然后从value复制pricelistofspareparts其中name是“域spare2”在spareparts1XSLT复制子节点的值于母公司

输入:

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

请让我知道我在这里失踪。

回答

1

首先,您的XML格式不正确,因为存在不一致性<Orderitem></orderitem>。所以我选择了这个元素<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> 

输出是任意的。

+0

嗨,@ zx485谢谢,../是访问父元素,即上面的一个级别,../../是上面的两个级别,但'name'和'listofspareparts'是'价格的兄弟姐妹',请问节点位置如何评估?从上下文来看,如果我使用// vs。//是否有区别? – Krish

+0

@Krish:标准轴是选择当前节点的子节点,所以如果你的当前节点是'price',表达式'name'就会被搜索为'price'的子节点。因此'../'选择_sibling_轴表示当前节点的所有兄弟(例如'name'和'listofspareparts')。 – zx485

+0

关于你的第二个问题:''//选择文档中的所有节点(_relative to root_)和'.//'选择当前节点的所有子节点(相对于current_)。 – zx485