如何在 XSLT 中标记化使用 group-by 后删除相同的数字

How to remove same number after tokenize use group-by in XSLT

我试图在标记值和另一个输入值后删除重复的数字,例如<p>1(a), (b), (c)</p><p>1(a)</p>。如何使用 group-by.
删除重复条目 输入XML

<root>
    <p>1(a), (b), (c)</p>
    <p>1(a)</p>
    <p>2(a)</p>
    <p>3(a)</p>
    <p>1(c)</p>
</root>

预期输出

<root>
   <p>1(a)</p>
   <p>1(b)</p>
   <p>1(c)</p>
   <p>2(a)</p>
   <p>3(a)</p>
</root>

XSLT 代码

<xsl:template match="root">
    <root>
        <xsl:for-each-group select="p" group-by=".">
            <xsl:sort select="current-grouping-key()" data-type="number" order="ascending"/>
            <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), '(.*)\(.*?\)$', '') || .
                                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>

可能够用

  <xsl:template match="root">
      <xsl:copy>
          <xsl:for-each 
            select="distinct-values(
                      p ! 
                      (let $tokens := tokenize(., '\s*,\s*') 
                           return (head($tokens), tail($tokens) ! (substring-before(head($tokens), '(') || .)))
                    )" expand-text="yes">
              <p>{.}</p>
          </xsl:for-each>
      </xsl:copy>
  </xsl:template>

https://xsltfiddle.liberty-development.net/6q1SDkG