如何在XSLT中用','插入tokenize后最后一个'('之前的子串值。

问题描述 投票:0回答:1

我想插入值 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>

代码。 https:/xsltfiddle.liberty-development.net3NSTbfj31

xslt xslt-2.0
1个回答
2
投票

我认为您似乎只是想将第一个标记中的任何字符连接到最后一个标记之前。( 到标记化的值。

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

https:/xsltfiddle.liberty-development.net3NSTbfj33。

© www.soinside.com 2019 - 2024. All rights reserved.