Как из групп из узлов без изменения порядка? - PullRequest
1 голос
/ 09 марта 2012

Допустим, у нас есть несколько предметов, которые являются фруктами или одеждой:

<items>
    <orange/>
    <banana/>
    <apple/>
    <jacket/>
    <shirt/>
    <trousers/>
    <apple/>
    <banana/>
    <jacket/>
    <apple/>
    <banana/>
</items>

И я бы хотел, чтобы они были сгруппированы следующим образом без изменения порядка элементов:

<items>
    <fruits>
        <orange/>
        <banana/>
        <apple/>
    </fruits>
    <clothes>
        <jacket/>
        <shirt/>
        <trousers/>
    </clothes>
    <fruits>
        <apple/>
        <banana/>
    </fruits>
    <clothes>
        <jacket/>
    </clothes>
    <fruits>
        <apple/>
        <banana/>
    </fruits>
</items>

Я - новичок в том, что касается XSLT, и после просмотра бесчисленных примеров я до сих пор не представляю, как этого добиться с помощью XSLT.

1 Ответ

3 голосов
/ 09 марта 2012

Любой вид группировки в XSLT2 проще, чем XSLT1, поэтому я приму XSLT2, как вы не сказали

<xsl:stylesheet version="2.0" 
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:f="data:f"
        exclude-result-prefixes="f">

<xsl:output indent="yes"/>

<xsl:template match="items">
 <xsl:for-each-group select="*"
             group-adjacent="f:type(.)">
  <xsl:element name="{current-grouping-key()}">
   <xsl:copy-of select="current-group()"/>
  </xsl:element>
 </xsl:for-each-group>
</xsl:template>

<xsl:function name="f:type">
 <xsl:param name="n"/>
 <xsl:apply-templates mode="type" select="$n"/>
</xsl:function>

<xsl:template mode="type" match="orange|banana|apple">fruits</xsl:template>

<xsl:template mode="type" match="shirt|trousers|jacket">clothes</xsl:template>

<xsl:template mode="type" match="*">x</xsl:template>

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