1

我有以下 xml 示例:

<test>
<p>Some text (page 24)</p>
<p>Some text  (Page 24)</p>
<p>there is some text here (page 24) and here (page 25)</p>
<p>some text (pages 24, 7, 9)</p>
</test>

我想使用一些正则表达式将所有页面文本片段包装到 page_ref 标记中,因此结果如下所示:

<test>
<p>Some text <page_ref>(page 24)</page_ref></p>
<p>Some text <page_ref>(Page 24)</page_ref></p>
<p>there is some text here <page_ref>(page 24)</page_ref> and here <page_ref>(page 25)</page_ref></p>
<p>some text <page_ref>(pages 24, 7, 9)</page_ref></p>
</test>

我的代码如下

<xsl:template match="text()">
    <xsl:analyze-string select="." regex="\(([pP]age).*\)">
        <xsl:matching-substring>
            <page_ref><xsl:value-of select="."/></page_ref>
        </xsl:matching-substring>
        <xsl:non-matching-substring>
            <xsl:value-of select="."/>
        </xsl:non-matching-substring>
    </xsl:analyze-string>
</xsl:template>

但它在我的 3d p 标签上失败了,因为它产生

<p>there is some text here <page_ref>(page 24) and here (page 25)</page_ref></p>

因此,如果有人能够指出我的错误,我将是一个快乐的人。提前致谢 !

4

2 回答 2

1

试试这个正则表达式:

\(pages?\s+\d+(,\s*\d+)*\)

PS:这是使用 .NET 正则表达式进行测试的,但它也应该适用于 XSLT

于 2013-02-11T15:32:50.000 回答
1

您可以尝试匹配除 ) 之外的任何字符,直到下一个 )。

"\(([pP]age)[^)]*\)"
于 2013-02-11T15:34:16.787 回答