Ваш код уже почти там. Нет необходимости ссылаться на элементы по индексу.
myList = ['-1.02', '-1.03', '-0.81', '-0.17', '-0.07', '0.22', '0.88', '0.88', '0.69']
for i in myList:
if i[0] == '-' and int(i[-2]) > 5:
do sth...
Если все, что вы хотите сделать, это округлить, то вы можете использовать понимание списка.
roundlist = [round(float(i)) for i in myList]
Вот то, как я сделал бы это, с помощью метода Muenchean. Google 'xslt muenchean' для большего количества информации от более умных людей. Мог бы быть умный путь, но я оставлю это другим.
Одно примечание, я избегаю использования прописных букв в начале xml имен элементов, например, 'Файла', но Вам решать
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:key name="files" match="/Problems/Problem/File" use="./text()"/>
<xsl:template match="/">
<html>
<body>
<xsl:apply-templates select="Problems"/>
</body>
</html>
</xsl:template>
<xsl:template match="Problems">
<xsl:for-each select="Problem/File[generate-id(.) = generate-id(key('files', .))]">
<xsl:sort select="."/>
<h1>
<xsl:value-of select="."/>
</h1>
<xsl:apply-templates select="../../Problem[File=current()/text()]"/>
</xsl:for-each>
</xsl:template>
<xsl:template match="Problem">
<p>
<xsl:value-of select="Description/text()"/>
</p>
</xsl:template>
</xsl:stylesheet>
Идея, ключ каждое использование элемента Файла, это - текстовое значение. Затем только отобразите значения файла, если они - тот же элемент как включенный. Чтобы проверить, являются ли они тем же, используйте генерировать-идентификатор. Существует аналогичный подход, где Вы сравниваете первый элемент, который соответствует. Я не могу сказать Вам, который более эффективен.
Я протестировал код здесь с помощью Marrowsoft Xselerator, моего любимого xslt инструмента, хотя больше не доступно, afaik. Результат, который я получил:
<html>
<body>
<h1>file1</h1>
<p>desc1</p>
<p>desc2</p>
<h1>file2</h1>
<p>desc1</p>
</body>
</html>
Это использует msxml4.
Я отсортировал вывод по Файлу. Я не уверен, хотели ли Вы это.
Я надеюсь, что это помогает.
Это решение немного более просто, более эффективно и в то же время более общее, чем то, представленное Richard:
Это преобразование:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- -->
<xsl:key name="kFileByVal" match="File"
use="." />
<!-- -->
<xsl:key name="kDescByFile" match="Description"
use="../File"/>
<!-- -->
<xsl:template match="/*">
<html>
<body>
<xsl:for-each select=
"*/File[generate-id()
=
generate-id(key('kFileByVal',.)[1])]">
<h1><xsl:value-of select="."/></h1>
<xsl:for-each select="key('kDescByFile', .)">
<p><xsl:value-of select="."/></p>
</xsl:for-each>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
при применении к предоставленный XML-документ:
<Problems>
<Problem>
<File>file1</File>
<Description>desc1</Description>
</Problem>
<Problem>
<File>file1</File>
<Description>desc2</Description>
</Problem>
<Problem>
<File>file2</File>
<Description>desc1</Description>
</Problem>
</Problems>
Приводит к требуемому результату:
<html>
<body>
<h1>file1</h1>
<p>desc1</p>
<p>desc2</p>
<h1>file2</h1>
<p>desc1</p>
</body>
</html>
Действительно отметьте простой шаблон соответствия первого <xsl:key>
и как, с помощью секунды <xsl:key>
, мы определяем местоположение всех"Description
"элементы, которые являются одноуровневыми элементами"File
"элемент, который имеет данное значение.
Мы, возможно, использовали больше шаблонов вместо <xsl:for-each>
обработка получения по запросу, однако это - довольно простой случай, и решение действительно извлекает выгоду из короче, более компактный и больше читаемого кода.
Также отметьте, который в XSLT 2.0 каждый будет обычно использовать <xsl:for-each-group>
инструкция вместо метода Muenchian.