Как обратить вспять теги XML данных с помощью XSLT - PullRequest
0 голосов
/ 07 апреля 2011

Например, ниже XML-файла.

<person>
    <name>John</name>
    <id>1</id>
    <name>Diane</name>
    <id>2</id>
    <name>Chris</name>
    <id>3</id>
</person>

Теперь, в XSLT, если я кодирую:

<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>

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

Ответы [ 3 ]

1 голос
/ 07 апреля 2011
<xsl:template match="person">
  <xsl:apply-templates select="name[2]|id[2]"/>
  <xsl:apply-templates select="name[position() != 2]|id[position() != 2]"/>
</xsl:template>

Предполагается, что всегда есть пара name и id.Если это не так, решение будет более сложным.

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

Вот очень специфическое решение очень специфической проблемы:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="person">
        <xsl:apply-templates select="name[text()='Diane']|id[text()='2']" />
        <xsl:apply-templates select="name[not(text()='Diane')] |
                                       id[not(text()='2')]" />
    </xsl:template>
</xsl:stylesheet>

Выход:

Diane2John1Chris3

Более общее решение потребовало бы более общего описания проблемы.

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

Код ниже позволит вам контролировать, сколько первых тегов вы хотите изменить, но я склонен согласиться с lwburk, что это может быть излишним, если вы точно знаете, что все, что вам нужно, это просто инвертировать только два первых тега.

<xsl:template match="person">
         <xsl:for-each select="name[position() &lt; 3]">
             <xsl:sort select="position()" data-type="number" order="descending"/>
             <xsl:apply-templates select="."/>
             <xsl:apply-templates select="./following-sibling::id[position() = 1]"/>
         </xsl:for-each>
         <xsl:apply-templates select="name[position() = 2]/following-sibling::*[position() &gt; 1]"/>
</xsl:template>
...