Объединение узлов XML с использованием XSLT - PullRequest
4 голосов
/ 03 декабря 2008

Возможно ли объединение элементов с использованием XSLT.

Если у меня есть следующий XML

<data>
<item column="left" value="1" />
<item column="left" value="2" />
<item column="right" value="3" />
<item column="left" value="4" />
<item column="right" value="5" />
<item column="right" value="6" />
<item column="right" value="7" />
<item column="left" value="8" />
<item column="right" value="9" />
<item column="right" value="10" />
</data>

Я хочу следующий вывод:

<data>
<item left="1" right="3 />
<item left="2" right="5" />
<item left="4" right="6" />
<item left="8" right="7" />
<item left="" right="9" />
<item left="" right="10" />
</data>

Но я абсолютно не знаю, возможно ли это с помощью XSLT

Ответы [ 2 ]

8 голосов
/ 03 декабря 2008

Это преобразование:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

    <xsl:template match="data">
      <xsl:variable name="vNumLeft" select="count(item[@column='left'])"/>

      <data>
        <xsl:apply-templates select="*[@column='left']"/>
        <xsl:apply-templates select=
                "*[@column='right'][position() > $vNumLeft]"/>
      </data>
    </xsl:template>

    <xsl:template match="item[@column='left']">
      <xsl:variable name="vPos" select="position()"/>

      <item left="{@value}" 
                    right="{../item[@column='right'][$vPos]/@value}"    />
    </xsl:template>

    <xsl:template match="item[@column='right']">
      <item left="" right="{@value}" />
    </xsl:template>
</xsl:stylesheet>

при применении к предоставленному документу XML:

<data>
    <item column="left" value="1" />
    <item column="left" value="2" />
    <item column="right" value="3" />
    <item column="left" value="4" />
    <item column="right" value="5" />
    <item column="right" value="6" />
    <item column="right" value="7" />
    <item column="left" value="8" />
    <item column="right" value="9" />
    <item column="right" value="10" />
</data>

дает желаемый результат:

<data>
   <item left="1" right="3"/>
   <item left="2" right="5"/>
   <item left="4" right="6"/>
   <item left="8" right="7"/>
   <item left="" right="9"/>
   <item left="" right="10"/>
</data>
0 голосов
/ 03 декабря 2008

Вы бы использовали теги элемента и атрибута ...

<xsl:element name="item">
    <xsl:attribute name="left"><xsl:value-of select="$theLeft"/></xsl:attribute>
    <xsl:attribute name="right"><xsl:value-of select="$theRight"/></xsl:attribute>
</xsl:element>

... что касается алгоритма для определения того, какими должны быть $ theLeft и $ theRight, я оставлю это вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...