Выберите данные с некоторым условием в xslt - PullRequest
0 голосов
/ 10 июня 2011

Мои данные таковы:

<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 голосов
/ 14 февраля 2012
<?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>

, что похоже на то, что вы ищете.

...