如果我正确阅读了问题,您希望输出最少的段落,以便段落中字符的总字符数大于所需的字符数。
例如,如果您有 20、30 和 40 个字符的段落。停止为 19 时,您只会吐出第一个,停止为 21 时,您将输出第 1 段和第 2 段(21<20+30),任何大于 50 的停止编号都将输出所有三个。
如果这是正确的,下面的输出将做你需要的 - 如果你改变这一行:
<xsl:if test="30 > string-length($prev)">
其中 30 成为要停止的字符串的所需长度。
这个 XSLT 模板...
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="ps">
<h2>
<xsl:value-of select="./@name"/>
</h2>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="p">
<xsl:variable name="prev">
<xsl:for-each select="preceding-sibling::node()">
<xsl:value-of select="."/>
</xsl:for-each>
</xsl:variable>
<xsl:if test="30 > string-length($prev)">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
...应用于本文档时...
<pss>
<ps name="test1">
<p>paragraph with 20 chars</p>
<p>paragraph with 300 chars</p>
<p>paragraph with 500 chars</p>
</ps>
<ps name="test2">
<p>paragraph with 20 chars much greater characters</p>
<p>paragraph with 300 chars</p>
<p>paragraph with 500 chars</p>
</ps>
<ps name="test2">
<p>few chars</p>
<p>few chars</p>
<p>few chars</p>
</ps>
</pss>
...产生这个输出。
<h2>test1</h2>
<div>
<p>paragraph with 20 chars</p>
<p>paragraph with 300 chars</p>
</div>
<h2>test2</h2>
<div>
<p>paragraph with 20 chars much greater characters</p>
</div>
<h2>test2</h2>
<div>
<p>few chars</p>
<p>few chars</p>
<p>few chars</p>
</div>