我想插入值 subring-before
最后的 '('
之后 tokenize
start-with, '('
. 我已经尝试了两个子串-前(例如. <xsl:value-of select="concat(substring-before(current-grouping-key(), '('), .)"/>
) '('
或 replace
功能 <p><xsl:value-of select="concat(replace(substring-before(current-grouping-key(), ','), '^([0-9]+)|(\(.*\))(\(([a-z0-9])\))', '$1$2'), .)"/></p>
. 输入 XML
<root>
<p>17200(b)(2), (4)–(6), (8), (12), (16), (20), and (21)</p>
<p>1(a), (b), (c)</p>
<p>2</p>
<p>2</p>
</root>
XSLT:
<xsl:template match="root">
<root>
<xsl:for-each-group select="p" group-by=".">
<xsl:choose>
<xsl:when test="contains(current-grouping-key(), ', ')">
<xsl:for-each select="tokenize(current-grouping-key(), ', and |, ')">
<xsl:choose>
<xsl:when test="starts-with(., '(')">
<p><xsl:value-of select="concat(replace(substring-before(current-grouping-key(), ','), '^([0-9]+)|(\(.*\))(\(([a-z0-9])\))', '$1$2'), .)"/></p>
<!--<p><xsl:value-of select="concat(substring-before(current-grouping-key(), '('), .)"/></p>-->
</xsl:when>
<xsl:otherwise>
<p><xsl:value-of select="."/></p>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<p><xsl:value-of select="current-grouping-key()"/></p>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each-group>
</root>
</xsl:template>
预期输出
<root>
<p>17200(b)(2)</p>
<p>17200(b)(4)–(6)</p>
<p>17200(b)(8)</p>
<p>17200(b)(12)</p>
<p>17200(b)(16)</p>
<p>17200(b)(20)</p>
<p>17200(b)(21)</p>
<p>1(a)</p>
<p>1(b)</p>
<p>1(c)</p>
<p>2</p>
</root>
我认为您似乎只是想将第一个标记中的任何字符连接到最后一个标记之前。(
到标记化的值。
<xsl:template match="root">
<root>
<xsl:for-each-group select="p" group-by=".">
<xsl:choose>
<xsl:when test="contains(current-grouping-key(), ', ')">
<xsl:variable name="tokens" select="tokenize(current-grouping-key(), ', and |, ')"/>
<xsl:for-each select="$tokens">
<p>
<xsl:value-of
select="if (starts-with(., '('))
then replace(head($tokens), '(.*)\(.*?\)$', '$1') || .
else ."/>
</p>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<p><xsl:value-of select="current-grouping-key()"/></p>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each-group>
</root>
</xsl:template>