使用xslt regex模式基于commaspacealphabet对字符串进行标记

时间:2017-11-20 06:32:46

标签: xml xslt

我需要基于" commaspacealphabet"来标记内容元素中的字符串。

<content>ss 2(2)(b), 3, Sch 2 line 10, 20,30, paras 10 div 10, 2 , 3</content>

下面我提到了预期的输出。

<content><sub>ss 2(2)(b), 3</sub><sub>Sch 2 line 10, 20,30</sub><sub>paras 10 div 10, 2 , 3</sub></content>

请任何人试着帮助我

2 个答案:

答案 0 :(得分:0)

当且仅当下一个非空格字符是字母时,我才会认为您希望逗号充当分隔符吗? (如果是这样,为什么你这样说不能让生活更轻松?)

您使用的是XSLT 2.0吗?再次标记您的问题。

使用tokenize()实现起来很棘手,因为XPath 2.0正则表达式中没有非捕获前瞻构造。

所以我可能会尝试:

<xsl:analyze-string select="." regex=",\s*\P{L}">
  <xsl:matching-substring>
    <sep><xsl:value-of select="."/></sep>
  </xsl:matching-substring>
  <xsl:non-matching-substring>
    <sub><xsl:value-of select="."/></sub>
  </xsl:matching-substring>
</xsl:analyze-string>

接着是第二个传递,它将<sub>元素与以下<sep>元素的第一个字符合并。

但也许有更好的方法,这是第一次尝试。

答案 1 :(得分:0)

一种方法可能是使用带有,\s+([A-Za-z])正则表达式的analyze-substring来匹配分隔符,但是然后输出分隔符,并将捕获的匹配写入两次。

然后,您可以使用tokenize结果,使用相同的正则表达式来拆分表达式,从而删除重复的字母,然后将其放回原位,但周围有sub个标签

试试这个模板

  <xsl:template match="content">
    <xsl:variable name="first">
      <xsl:analyze-string select="." regex=",\s+([A-Za-z])">
        <xsl:matching-substring>
          <xsl:value-of select="."/><xsl:value-of select="regex-group(1)" />
        </xsl:matching-substring>
        <xsl:non-matching-substring>
          <xsl:value-of select="."/>
        </xsl:non-matching-substring>
      </xsl:analyze-string>
    </xsl:variable>
   <xsl:copy>
      <xsl:for-each select="tokenize($first, ',\s+[A-Za-z]')">
          <sub><xsl:value-of select="." /></sub>
      </xsl:for-each>
   </xsl:copy>
  </xsl:template>

当应用于此元素时......

<content>ss 2(2)(b), 3, Sch 2 line 10, 20,30, paras 10 div 10, 2 , 3</content>

以下是输出

<content><sub>ss 2(2)(b), 3</sub><sub>Sch 2 line 10, 20,30</sub><sub>paras 10 div 10, 2 , 3</sub></content>