XSLT在特定元素

时间:2017-03-19 12:04:14

标签: xml xslt xpath xls

我有以下TEI文件

<text>
    <pb n="1"/>
    <div>
        <head>title1</head>     
        <div>
            <head>title2</head>
            <l>line</l>
            <lg>1
                <l>line</l>
                <l>line</l>
            </lg>
            <lg>2
                <l>line</l>
                <pb n="2"/>
                <l>line</l>
            </lg>
            <lg>3
                <l>line</l>
                <l>line</l>
            </lg>
            <pb n="3"/>
            <lg>4
                <l>line</l>
                <l>line</l>
            </lg>
        </div>
    </div>
</text>

我需要在pb元素的最后一次出现到next之间选择节点并将其换行到页面标记。 pb元素可以在任何级别的文档上

我的模板:

<xsl:key name="pageNo" match="node()" use="preceding-sibling::pb[@n][1]/@n"/>

<xsl:template match="text" >
    <xsl:for-each select="descendant::pb">
        <xsl:element name="page">
            <xsl:copy-of select="key('pageNo',@n)"/> 
        </xsl:element>
    </xsl:for-each>
</xsl:template>

转型后的预期结果:

<text>
    <page n="1">
        <div>
            <head>title1</head>     
            <div>
                <head>title2</head>
                <l>line1</l>
                <lg>1
                    <l>line</line>
                    <l>line</line>
                </lg>
                <lg>2
                    <l>line</line>
                </lg>
            </div>
        </div>
    </page>
    <page n="2">
        <div>
            <div>
                <lg>
                    <l>line</line>
                </lg>
                <lg>3
                    <l>line</line>
                    <l>line</line>
                </lg>
            </div>
        </div>
    </page>
    <page n="3">
        <div>
            <div>
                <lg>4
                    <l>line</line>
                    <l>line</line>
                </lg>
            </div>
        </div>
    </page>
</text>

1 个答案:

答案 0 :(得分:0)

使用XSLT 2.0,您可以使用for-each-group select="node()" group-starting-with="pb"

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

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

    <xsl:template match="text">
        <xsl:copy>
            <xsl:variable name="parent" select="."/>
            <xsl:for-each-group select="descendant::node()" group-starting-with="pb[@n]">
                <page n="{@n}">
                    <xsl:apply-templates select="$parent/node()[descendant-or-self::node() intersect current-group()]" mode="subtree"/>
                </page>
            </xsl:for-each-group>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="pb[@n]" mode="subtree"/>

    <xsl:template match="node()" mode="subtree">
            <xsl:copy>
                <xsl:copy-of select="@*"/>
                <xsl:apply-templates select="node()[descendant-or-self::node() intersect current-group()]" mode="subtree"/>
            </xsl:copy>

    </xsl:template>

</xsl:stylesheet>

对于您发布的输入,它会提供所需的结果。