我有一个片段:
<p>keyword1 text text more text
</p>
<p>more text</p>
<p>more text</p>
<p>keyword2 text text more text
</p>
<p>more text</p>
<p>more text</p>
<p>keyword3 text text more text
</p>
<p>more text</p>
<p>more text</p>
<p>keyword4
</p>
</body>
在上面的代码段中,我有一个可选关键字列表。随后的文本具有可变长度。在出现下一个关键字之前,可能会有多个<p></p>
分组。当出现下一个关键字时,它表示上一个关键字的结尾。
在XSLT中这是一个很好的方法。
编辑: 假设我的关键字是:keyword1,keyword2,keyword3,keyword4
版本1.0
我会在一段时间后发布我的xslt ......但它不能正常工作
答案 0 :(得分:0)
我使用XSLT 2.0分组结构,group-starts-with
属性为包含关键字的每个p元素返回true。
就是这样:
<xsl:variable name="keywords"
as="xs:string*"
select="('keyword1', 'keyword2', 'keyword3', 'keyword4')"
/>
<xsl:for-each-group select="p"
group-starting-with="tokenize(., '\s+') = $keywords">
<!--* process each group here ... *-->
</xsl:for-each-group>
答案 1 :(得分:0)
目前尚不清楚你打算得到什么样的结果。
C.M。 Sperberg的方法解决了正确的基本思想,但提供的代码似乎不能与我的XSL处理器一起运行。所以我建议像这样的转换
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output indent="yes" method="xml"/>
<xsl:variable name="keywords" select="'keyword1 keyword2 keyword3 keyword4'"/>
<xsl:template match="body">
<xsl:copy>
<xsl:for-each-group select="p" group-starting-with="p[contains($keywords,substring-before(.,' '))]">
<div>
<xsl:attribute name="class">
<xsl:value-of select="substring-before(current-group()[1],' ')"/>
</xsl:attribute>
<xsl:copy-of select="current-group()"/>
</div>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:transform>