在子属性上匹配表达式

时间:2017-03-20 21:22:51

标签: xml xslt

我有这样的XML文件:

 <comp ref="C2">
    <value>100uF</value>
    <footprint>Capacitors_SMD:c_elec_6.3x7.7</footprint>
    <datasheet>EEEFK1V101XP</datasheet>
    <fields>
      <field name="Manufacturer">Panasonic</field>
      <field name="Voltage">35V</field>
      <field name="Symbol">EEEFK1V101XP</field>
    </fields>
    <libsource lib="device" part="CP"/>
    <sheetpath names="/" tstamps="/"/>
    <tstamp>57B38AFC</tstamp>
</comp>

<comp ref="C1">
  <value>100uF</value>
  <footprint>Capacitors_SMD:c_elec_6.3x7.7</footprint>
  <fields>
    <field name="Voltage">25V</field>
    <field name="Symbol">2345</field>
  </fields>
  <libsource lib="device" part="CP"/>
  <sheetpath names="/" tstamps="/"/>
  <tstamp>57B492EF</tstamp>
</comp>

我想单独显示这些组件,因为它们不相似。 当我使用datasheet节点时,它可以工作。

<xsl:key name="partTypeByValueAndFootprint" match="comp" use="concat(datasheet, '-', footprint, '-', value)" />

<xsl:for-each select="comp[count(. | key('partTypeByValueAndFootprint', concat(datasheet, '-', footprint, '-', value))[1]) = 1]">
<xsl:sort select="@ref" />

但我不知道为什么当我使用fields/field/@name="Symbol"时它不起作用。

<xsl:key name="partTypeByValueAndFootprint" match="comp" use="concat(fields/field/@name='Symbol', '-', footprint, '-', value)" />

    <xsl:for-each select="comp[count(. | key('partTypeByValueAndFootprint', concat(fields/field/@name='Symbol', '-', footprint, '-', value))[1]) = 1]">
    <xsl:sort select="@ref" />

1 个答案:

答案 0 :(得分:2)

而不是fields/field/@name='Symbol',而不是fields/field[@name='Symbol']。方括号表示要应用于所选节点的条件。

例如......

<xsl:key name="partTypeByValueAndFootprint" 
         match="comp" 
         use="concat(fields/field[@name='Symbol'], '-', footprint, '-', value)" />