给定输入文档是一系列相同级别的节点,我想找到出现在两个标志之间的那些节点(它们本身就是节点)。标志可以多次使用,最终结果应该将相同标志之间的所有内容组合在一起。我对此很感兴趣。
鉴于此输入文档:
<root>
<p class="text">Hello world 1.</p>
<p class="text">Hello world 2.</p>
<p class="text">Hello world 3.</p>
<p class="excerptstartone">Dummy text</p> <!-- this flag identifies the start of the nodes I want to select -->
<p class="text">Hello world 4.</p>
<p class="text">Hello world 5.</p>
<p class="text">Hello world 6.</p>
<p class="excerptendone">Dummy text</p> <!-- this flag identifies the end of the nodes I want to select -->
<p class="text">Hello world 7.</p>
<p class="excerptstarttwo">Dummy text</p> <!-- this flag identifies the start of the nodes I want to select -->
<p class="text">Hello world 8.</p>
<p class="excerptendtwo">Dummy text</p> <!-- this flag identifies the end of the nodes I want to select -->
<p class="text">Hello world 9.</p>
<p class="excerptstartone">Dummy text for starting a new excerpt</p> <!-- this flag identifies the start of the nodes I want to select -->
<p class="text">Hello world 10.</p>
<p class="text">Hello world 11.</p>
<p class="excerptendone">Dummy text</p> <!-- this flag identifies the end of the nodes I want to select -->
<p class="text">Hello world 12.</p>
<p class="text">Hello world 13.</p>
<p class="text">Hello world 14.</p>
<p class="text">Hello world 15.</p>
<p class="text">Hello world 16.</p>
<p class="text">Hello world 17.</p>
</root>
我想要这个输出:
<root>
<p class="excerptstartone">Dummy text</p>
<p class="text">Hello world 4.</p>
<p class="text">Hello world 5.</p>
<p class="text">Hello world 6.</p>
<p class="text">Hello world 10.</p>
<p class="text">Hello world 11.</p>
<p class="excerptendone">Dummy text</p>
<p class="excerptstarttwo">Dummy text</p>
<p class="text">Hello world 8.</p>
<p class="excerptendtwo">Dummy text</p>
</root>
注意:标志将始终以“excerptstart”和“excerptend”开头,并且标志的后缀将始终匹配(也就是说,由业务规则保证,如果存在“excerptstartone”,则始终存在“excerptendone”)。
这就是我到目前为止所拥有的。只要我硬编码excerptstart 后缀(即'one'、'two'),我就能找到我想要的集合。我坚持尝试概括它,因此不必对后缀进行硬编码(我还应该说我不关心在结果树中保留开始/结束段落“标志”;我已经硬编码了那些这里是为了方便评估结果树):
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:template match="root">
<root>
<p class="excerptstartone">Dummy text</p>
<xsl:for-each select="p[@class='excerptstartone']">
<xsl:sequence select="following-sibling::node() intersect following-sibling::p[@class='excerptendone'][1]/preceding-sibling::node()"/>
</xsl:for-each>
<p class="excerptendone">Dummy text</p>
<p class="excerptstarttwo">Dummy text</p>
<xsl:for-each select="p[@class='excerptstarttwo']">
<xsl:sequence select="following-sibling::node() intersect following-sibling::p[@class='excerptendtwo'][1]/preceding-sibling::node()"/>
</xsl:for-each>
<p class="excerptendtwo">Dummy text</p>
</root>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>