根据XSLT中同一级别的下一个元素值包装子元素

时间:2016-02-29 09:16:49

标签: xml xslt element

我有多个ENTRY元素,其中包含其他一些元素:

<ENTRY>
    <HEAD>samplehead</HEAD>
    <NUM>1</NUM>
    <EXPL></EXPL>
    <TRAN></TRAN>

    <NUM>2 </NUM>
    <EXPL></EXPL>
    <COMP></COMP>

    <NUM>3 </NUM>
    <TRAN></TRAN>
    <DIS></DIS>
</ENTRY>

我想基于num元素添加一个新的主体,所以我最终会用

<element>
    <body>
    <expl></expl>
    <tran></tran>
    </body>

    <body>
    <expl></expl>
    <comp>/comp>
    </body>

    <body>
    <tran></tran>
    <dis></dis>
    </body>
</element>

如何使用xslt 1.0实现这一目标?

提前感谢:)

1 个答案:

答案 0 :(得分:0)

您可以从身份模板开始

<!-- override the ENTRY node  -->
<xsl:template match="ENTRY">
    <element>
        <!-- loop for each NUM node -->
        <xsl:for-each select="NUM">
            <!-- store the current generate-id() -->
            <xsl:variable name="ID" select="generate-id(.)"/>
            <body>
                <!-- apply following nodes, excluding the NUM node -->
                <xsl:apply-templates select="following-sibling::*[not(self::NUM)][generate-id(preceding-sibling::NUM[1]) = $ID]"/>
            </body>
        </xsl:for-each>
    </element>
</xsl:template>

然后是覆盖模板

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

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

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

    <xsl:template match="ENTRY">
        <element>
            <xsl:for-each select="NUM">
                <xsl:variable name="ID" select="generate-id(.)"/>
                <body>
                    <xsl:apply-templates select="following-sibling::*[not(self::NUM)][generate-id(preceding-sibling::NUM[1]) = $ID]"/>
                </body>
            </xsl:for-each>
        </element>
    </xsl:template>
</xsl:stylesheet>

因此整个样式表:

{{1}}