xslt xml解析带有可变文本组的可选关键字

时间:2014-01-03 15:59:45

标签: xslt xml-parsing

我有一个片段:

<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 ......但它不能正常工作

2 个答案:

答案 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>