Отличные элементы и группировка

Ваш код уже почти там. Нет необходимости ссылаться на элементы по индексу.

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]
8
задан Mathias Müller 25 March 2014 в 16:36
поделиться

2 ответа

Вот то, как я сделал бы это, с помощью метода 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.

Я отсортировал вывод по Файлу. Я не уверен, хотели ли Вы это.

Я надеюсь, что это помогает.

5
ответ дан 5 December 2019 в 14:07
поделиться

Это решение немного более просто, более эффективно и в то же время более общее, чем то, представленное 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.

7
ответ дан 5 December 2019 в 14:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: