我有以下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>
答案 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>
对于您发布的输入,它会提供所需的结果。