我需要根据元素对数据进行分组并填充它。
下面提到的是输入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>
非常感谢。
答案 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>