重新组合模板中的节点对

时间:2016-10-17 12:15:37

标签: xml xslt-1.0

我有一个包含事件列表的XML文件。事实上,每个事件都是一段时间的end<Events> <Event id="1" type="begin" date="xxxx"/> <Event id="2" type="end" date="xxxy"/> <Event id="3" type="begin" date="xxyx"/> <Event id="4" type="end" date="xyxx"/> <Event id="5" type="begin" date="yxxx"/> <Event id="6" type="end" date="xxyy"/> </Events> 事件。假设以下XML:

<Events>
    <xsl:apply-templates select="//Event"/>
</Events>

<xsl:template match="Event">
    <Period>
        <Begin>
            <Event>
                <xsl:attribute name="id" select="[@type='begin']/@id"/>
                <xsl:attribute name="date" select="[@type='begin']/@date"/>
            </Event>
        </Begin>
        <End>
            <Event>
                <xsl:attribute name="id" select="[@type='end']/@id"/>
                <xsl:attribute name="date" select="[@type='end']/@date"/>
            </Event>
        </End>
    </Period>
</xsl:template>

我想申请的是这样的:

<Events>
    <Period>
        <Begin>
            <Event id="1" type="begin" date="xxxx"/>
        </Begin>

        <End>
            <Event id="2" type="end" date="xxxy"/>
        </End>
    </Period>

    <Period>
        <Begin>
            <Event id="3" type="begin" date="xxyx"/>
        </Begin>

        <End>
            <Event id="4" type="end" date="xyxx"/>
        </End>
    </Period>

    <Period>
        <Begin>
            <Event id="5" type="begin" date="yxxx"/>
        </Begin>

        <End>
            <Event id="6" type="end" date="xxyy"/>
        </End>
    </Period>
</Events>

预期的结果将是:

<Events>
    <Period>
        <Begin>
            <Event id="1" type="begin" date="xxxx"/>
        </Begin>

        <End>
            <Event id="" type="end" date=""/>
        </End>
    </Period>

    <Period>
        <Begin>
            <Event id="" type="begin" date=""/>
        </Begin>

        <End>
            <Event id="2" type="end" date="xxxy"/>
        </End>
    </Period>

    ...

</Events>

但结果是这一个:

<person-detail person="vm.selectedPerson"></person-detail>

我理解为什么我得到这个结果,因为模板一个接一个地按元素匹配元素,但我想知道是否有办法通过使用模板匹配来实现我的目标&#34;两个节点在同一时间&#34; ?我已经查看了SO,但我发现的唯一一个接近我想要的解决方案的是Muenchian分组(对于像上面这样的小数据集来说,设置起来真的很复杂。)

1 个答案:

答案 0 :(得分:2)

嗯,这样的事情应该可以胜任 - 我假设<Event type="begin">总是紧跟其对应的<Event type="end">

<xsl:template match="Event[@type='begin']">
    <Period>
        <Begin>
            <xsl:copy-of select="."/>
        </Begin>
        <End>
            <xsl:copy-of select="following-sibling::Event[1]"/>
        </End>
    </Period>
</xsl:template>

在这里演示:http://xsltransform.net/ejivdH4