我需要基于" 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>
请任何人试着帮助我
答案 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>