XSLT:头元素

时间:2017-04-27 21:10:05

标签: xml xslt-2.0

我需要根据元素对数据进行分组并填充它。

下面提到的

是输入xml,如果你看到P有4行,那么Head元素开始就是我需要跟随P的组合。

在生成实际输出时我需要分组。

我需要转换这个 -

<?xml version="1.0" encoding="UTF-8"?>
<root>
<row id="j1">
<name>Marcus C.</name>
<P id="j1_p1">[1] Text</P>
<P id="j1_p2">[2] Text</P>
<P id="j1_p3">[3] Text</P>
<P id="j1_p4">[4] Text</P>
<Head hlevel="h1">
<Emph type="b">Facts</Emph>
</Head>
<P id="j1_p5">[5] Text</P>
<P id="j1_p6">[6] Text</P>
<P id="j1_p7">[7] Text</P>
<Head hlevel="h1">
<Emph type="b">Trial</Emph>
</Head>
<P id="j1_p8">[8] Text</P>
<P id="j1_p9">[9] Text</P>
<P id="j1_p10">[10] Text</P>
</row>
</root>

所需的输出将是:

<root>
    <row id="j1">
        <name>Marcus C.</name>
        <P id="j1_p1">[1] Text</P>
        <P id="j1_p2">[2] Text</P>
        <P id="j1_p3">[3] Text</P>
        <P id="j1_p4">[4] Text</P>
        <Group>
            <Head hlevel="h1">
                <Emph type="b">Facts</Emph>
            </Head>
            <P id="j1_p5">[5] Text</P>
            <P id="j1_p6">[6] Text</P>
            <P id="j1_p7">[7] Text</P>
        </Group>
        <Group>
            <Head hlevel="h1">
                <Emph type="b">Trial</Emph>
            </Head>
            <P id="j1_p8">[8] Text</P>
            <P id="j1_p9">[9] Text</P>
            <P id="j1_p10">[10] Text</P>
        </Group>
    </row>
</root>

在使用xml运行XSLT后,它确实将Head包装在Group标签中,但不会复制Group下的所有后续P.

 <xsl:template match="row/Head[child::Emph]">
    <Group>
        <Head>
            <xsl:apply-templates />
        </Head>
    </Group>
  </xsl:template>

非常感谢。

1 个答案:

答案 0 :(得分:0)

for-each-group应该有所帮助:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">


    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

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

    <xsl:template match="row">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:for-each-group select="*" group-starting-with="Head[@hlevel = 'h1']">
                <xsl:choose>
                    <xsl:when test="self::Head[@hlevel = 'h1']">
                        <Group>
                            <xsl:apply-templates select="current-group()"/>
                        </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/3Mvmrzu