XSLT如何在新组中复制以下元素

时间:2017-06-26 06:38:34

标签: xslt-2.0

我有这个平面的xml。我需要将内容分组在h1 / title上并复制以下所有内容,直到下一个h1 / title模式(如果存在),否则添加空para。

源XML:

<Element>
    <group>
    <h1>
        <title>Name1</title>
    </h1>
    <para> </para>
    </group>
    <group>
    <h1>
        <title>Name2</title>
    </h1>
    <para>Test1</para>
    <para>Test2</para>
    </group>
    <group>
    <h1>
        <title>Name3</title>
    </h1>
    <para>Test3</para>
    <para>Test4</para>
    </group>
</Element>

我想要输出如下。

<xsl:template match="h1">
    <group>
        <xsl:copy>
        <xsl:for-each-group select="*" group-starting-with="h1">
            <xsl:choose>
                <xsl:when test="self::h1">
                    <group>
                        <xsl:apply-templates select="current-group()"/>
                        <xsl:apply-templates select="following-sibling::para[not(following::h1)]"/>
                    </group>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:apply-templates select="current-group()"/>  
                </xsl:otherwise>
            </xsl:choose>
        </xsl:for-each-group>
        </xsl:copy>
    </group>
</xsl:template>

到目前为止,我已经尝试过以下模板,但不会复制以下内容。

SELECT TimeStart, 
       TimeEnd, 
       StoodType  
  FROM dbo.WDT
    WHERE (     TimeStart BETWEEN  @StartTime AND @EndTime  -- Sets which start in your timeband
             OR TimeEnd   BETWEEN  @StartTime AND @EndTime) -- Sets which end in your timeband
        OR (    TimeStart < @StartTime   -- Sets which totally overlap your timeband
            AND TimeEnd > @EndTime
           )
;

1 个答案:

答案 0 :(得分:0)

我建议将Element元素的子元素分组,然后当然在for-each-group内部,您只需检查是否没有第二个组项添加空para

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

    <xsl:output indent="yes"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="Element">
        <xsl:copy>
            <xsl:for-each-group select="*" group-starting-with="h1">
                <xsl:choose>
                    <xsl:when test="self::h1">
                        <group>
                            <xsl:apply-templates select="current-group()"/>
                            <xsl:if test="not(current-group()[2])">
                                <para/>
                            </xsl:if>
                        </group>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:apply-templates select="current-group()"/>  
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:for-each-group>
        </xsl:copy>
    </xsl:template>

</xsl:transform>

http://xsltransform.net/naZXpX7在线。