XSLT: цикл выбора двух элементов одновременно - PullRequest
7 голосов
/ 15 июля 2009

У меня есть несколько XML-документов, в которых автор решил представить набор декартовых точек, например:

<row index="0">
  <col index="0">0</col>
  <col index="1">0</col>
  <col index="2">1</col>
  <col index="3">1</col>
</row>

Это будет равно точкам (0,0) и (1,1).

Я хочу переписать это как

<set>
  <point x="0" y="0"/>
  <point x="1" y="1"/>
</set>

Однако я не могу понять, как создать это в XSLT, кроме жесткого кодирования для каждого возможного случая - например, для набора из 4 пунктов:

<set>
  <point>
    <xsl:attribute name="x"><xsl:value-of select="col[@index = 0]"/></xsl:attribute>
    <xsl:attribute name="y"><xsl:value-of select="col[@index = 1]"/></xsl:attribute>
  </point>
  <point>
    <xsl:attribute name="x"><xsl:value-of select="col[@index = 1]"/></xsl:attribute>
    <xsl:attribute name="y"><xsl:value-of select="col[@index = 2]"/></xsl:attribute>
  </point>
  ...

Должен быть лучший способ сделать это? Подводя итог, я хочу создать такие элементы, как <point x="..." y="..."/>, где x и y - четные / нечетные col элементы.

1 Ответ

9 голосов
/ 15 июля 2009

Конечно, есть универсальный способ:

<xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>

  <xsl:template match="row">
    <set>
      <xsl:apply-templates select="
        col[position() mod 2 = 1 and following-sibling::col]
      " />
    </set>
  </xsl:template>

  <xsl:template match="col">
    <point x="{text()}" y="{following-sibling::col[1]/text()}" />
  </xsl:template>

</xsl:stylesheet>

Вывод для меня:

<set>
  <point x="0" y="0" />
  <point x="1" y="1" />
</set>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...