Отрицательные целые числа в процентах - PullRequest
0 голосов
/ 13 ноября 2009

У меня много файлов с данными для преобразования в проценты с использованием основных математических функций:

<param id="1" name="otb" value="0.160"/>
<param id="2" name="blm" value="-0.210"/>
<param id="3" name="mep" value="-0.010"/>
<param id="4" name="plc" value="-0.100"/>

У каждого идентификатора есть свое уравнение:

  1. (п - (-. 3)) / 2,3 * 100
  2. (п - (-. 8)) / 3,3 * 100
  3. (п - (-. 5)) / 1,5 * 100
  4. (п -. (1)) / 1,1 * 100

Итак, я получаю:

OTB = 8 BLM = 20 MEP = 24 плс = 0

Что может быть хорошим способом для запуска всех этих файлов через ... regex и php? Какой-нибудь быстрый и грязный код там? : D

Ответы [ 2 ]

1 голос
/ 13 ноября 2009

Поскольку файл выглядит в формате XML, я предлагаю вам попробовать библиотеку PHP simplexml. Документацию можно найти здесь .

После этого вы можете получить доступ к дереву XML, просто открыв магические свойства объекта XML:

$xml = simplexml_load_file('your/path/to/your/file');

foreach ($xml->param as $param)
{
    $id = $param['id'];
    $name = $param['name'];
    $value = $param['value'];

    // do your calculations...
}
0 голосов
/ 13 ноября 2009

Магия стилей:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
  <xsl:output indent="yes" standalone="yes" omit-xml-declaration="yes" method="xml"/>
  <xsl:template match="*">
    <xsl:copy>
      <xsl:variable name="Values" select="@*[(name(..)='param') and ((name(.)='value'))]"/>
      <xsl:variable name="NonValues" select="@*[. != $Values]"/>
      <xsl:apply-templates select="$NonValues" mode="NonValues"/>
      <xsl:apply-templates select="$Values" mode="Values"/>
      <xsl:choose>
        <xsl:when test="*">
          <xsl:apply-templates select="*"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="."/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="@*" mode="Values">
    <xsl:attribute name="value"><xsl:variable name="n" select="."/><xsl:choose><xsl:when test="../@id=1"><xsl:value-of select="(($n - (-0.3)) div 2.3) * 100"/></xsl:when><xsl:when test="../@id=2"><xsl:value-of select="(($n - (-0.8)) div 3.3) * 100"/></xsl:when><xsl:when test="../@id=3"><xsl:value-of select="(($n - (-0.5)) div 1.5) * 100"/></xsl:when><xsl:when test="../@id=4"><xsl:value-of select="(($n - (0.1)) div 1.1) * 100"/></xsl:when><xsl:otherwise><xsl:value-of select="."/></xsl:otherwise></xsl:choose></xsl:attribute>
  </xsl:template>
  <xsl:template match="@*" mode="NonValues">
    <xsl:copy>
      <xsl:value-of select="(.)*2"/>pp
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

Если вы можете преобразовать исходный XML с помощью этой таблицы стилей, вы получите новый XML с вычисленными результатами. Это немного сложно, но в основном код обрабатывает все элементы и дочерние элементы. Для каждого элемента он разделяет атрибуты на значения, которые необходимо преобразовать, и другие значения. Он копирует каждый элемент, каждый дочерний элемент и каждый атрибут, кроме атрибутов значения. Атрибуты значения обрабатываются и получают другое значение. (Но вы также можете просто добавить исходное значение, если хотите сохранить его.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...