在xslt中选择具有某些条件的数据

时间:2011-06-10 09:20:11

标签: xslt xslt-1.0

我的数据是这样的:

<Source>

<input>
    <plant>
        YYYYY
    </plant>
    <group>
        Georgia Power Co
    </group>
    <unit>
        Wilmot IC 5
    </unit>
    <Status>
        Operating
    </Status>
    <code>
        56504
    </code>
    <change>
        2
    </change>
</input>

<input>
    <plant>
        XXXXX
    </plant>
    <group>
        Detroit Edison Co
    </group>
    <unit>
        Wilmot IC 5
    </unit>
    <Status>
        Operating
    </Status>
    <code>
        56504
    </code>
    <change>
        0
    </change>
</input>

<input>
    <plant>
        ZZZZZZ
    </plant>
    <group>
        Detroit Edison Co
    </group>
    <unit>
        Wilmot IC 4
    </unit>
    <Status>
        Operating
    </Status>
    <code>
        56504
    </code>
    <change>
        2
    </change>
</input>

</Source>

我想根据以下条件选择输入节点数据:

  1. <change>为2的输入数据应将<units><change>比较为0.
  2. 如果两个记录中的单位匹配,我应该比较两个节点中的其他值。
  3. 如果值有任何变化,我需要加粗它们。
  4. 在输出数据中,我不应该有更改为0的集合。这意味着它应该只显示2的输入。

1 个答案:

答案 0 :(得分:0)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <xsl:template match="input">
    <xsl:variable name="other" select="../input[change=0 and unit=current()/unit]"/>

    <xsl:if test="$other">
      <match>
        <unit>
          <xsl:value-of select="unit"/>
        </unit>
        <xsl:for-each select="*[name() != 'change']">
          <xsl:variable name="name" select="name()"/>
          <xsl:variable name="original" select="$other/*[name() = $name]"/>
          <xsl:if test="not(current() = $original)">
            <value>
              <xsl:attribute name="name">
                <xsl:value-of select="$name"/>
              </xsl:attribute>
              <two>
                <xsl:value-of select="current()"/>
              </two>
              <zero>
                <xsl:value-of select="$original"/>
              </zero>
             </value>
            </xsl:if>
        </xsl:for-each>
      </match>
    </xsl:if>
  </xsl:template>

  <xsl:template match="/Source">
    <xsl:apply-templates select="input[change=2]"/>
  </xsl:template>
</xsl:stylesheet>

返回

<match>
    <unit>
        Wilmot IC 5
    </unit>
    <value name="plant">
        <two>
            YYYYY
        </two>
        <zero>
            XXXXX
        </zero>
    </value>
    <value name="group">
        <two>
            Georgia Power Co
        </two>
        <zero>
            Detroit Edison Co
        </zero>
    </value>
</match>

这似乎就是你要找的东西。