Реверсировать XML-теги данных с помощью XSLT? - PullRequest
1 голос
/ 07 апреля 2011

Например, в следующем XML-файле:

<person>
    <name>John</name>
    <id>1</id>

    <name>Diane</name>
    <id>2</id>

    <name>Chris</name>
    <id>3</id>
</person>

В коде XSLT I:

<xsl:template match="person">
   <xsl:apply-templates/>
</xsl:template>

Чтобы в файле HTML отображалось

John1Diane2Chris3

.

Но, Мне нужен следующий вывод: Diane2John1Chris3

Мне нужно изменить порядок первых двух тегов данных. Здесь внизу первые 2 тега

<name>John</name>
<id>1</id>

<name>Diane</name>
<id>2</id>

Любые люди идеи?

Ответы [ 2 ]

1 голос
/ 07 апреля 2011
<xsl:template match="person">
  <xsl:apply-templates select="reverse(*)"/>
</xsl:template>

Эээ, извините, это для того, чтобы полностью изменить их, я вижу, что вы действительно не хотите полностью изменять все.

В этом случае самый простой способ - просто вручную закодировать заказв атрибуте `select:

<xsl:template match="person">
  <xsl:apply-templates select="name[2]"/>
  <xsl:apply-templates select="id[2]"/>
  <xsl:apply-templates select="name[1]"/>
  <xsl:apply-templates select="id[1]"/>
   ...
</xsl:template>

(Кстати, это не очень хороший формат для хранения ваших данных, вы должны заключить каждого человека в тег <person>, просто записав его одинпосле другого, а затем возиться с заказом, случается несчастный случай.)

0 голосов
/ 07 апреля 2011

Если вам всегда нужно поменять местами первых 2 человек, то вы можете сделать это:

<xsl:template match="person">
 <xsl:apply-templates select="name[position()=2]" />
 <xsl:apply-templates select="id[position()=2]" />

 <xsl:apply-templates select="name[position()=1]" />
 <xsl:apply-templates select="id[position()=1]" />

 <xsl:apply-templates select="node()[position() &gt; 4]" />
</xsl:template>

Это было бы проще, если бы у вас было отдельные элементы <person> для каждой пары "name" и "id".

...