我有这个平面的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
)
;
答案 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>