【问题标题】:XSLT REGEX pattern matchXSLT REGEX 模式匹配
【发布时间】:2016-08-16 08:43:59
【问题描述】:

使用 Saxon 9.7、XSLT 3.0,我正在尝试从文本字符串中选择方括号中的术语,然后删除这些术语的重复值。

到目前为止,我已经找到了一个模板,它可以选择我想要的子字符串,以及一个对字符串进行标记然后删除重复值的函数。 但是,我无法获得正确的正则表达式来标记字符串。

这是我的全文 XML

<column>
    <columnDerivationPrompt>Option 1: (No visit windowing)</columnDerivationPrompt>
    <columnDerivationDescription>Set to collected visit name [EG.VISIT] Set to 'POST-BASELINE MINIMUM' for the new observation generated for derviation type minimum [ADEG.DTYPE] = 'MINIMUM'
    Set to 'POST-BASELINE MAXIMUM' for the new observation generated for derviation type maximum [ADEG.DTYPE]= 'MAXIMUM'
    </columnDerivationDescription>
    <columnDerivationPrompt>Option 2:  (User defined visit windows)</columnDerivationPrompt>
    <columnDerivationDescription>Set to a re-defined visit range based on user-defined input, using formatting of Analysis Relative Day [ADEG.ADY] range in conjunction with Analysis Window Target [ADEG.AWTARGET] and Analysis Window Diff from Target [ADEG.AWTDIFF]  to determine analysis visit.
    Set to 'POST-BASELINE MINIMUM' for the new observation generated for derviation type minimum [ADEG.DTYPE] = 'MINIMUM'
    Set to 'POST-BASELINE MAXIMUM' for the new observation generated for derviation type maximum [ADEG.DTYPE]= 'MAXIMUM'
    </columnDerivationDescription>
</column>

从文本中提取的术语字符串,我需要从中删除重复项

EG.VISIT ADEG.DTYPE ADEG.DTYPE ADEG.ADY ADEG.AWTARGET ADEG.AWTDIFF ADEG.DTYPE ADEG.DTYPE

我想看什么

EG.VISIT ADEG.DTYPE ADEG.ADY ADEG.AWTARGET ADEG.AWTDIFF 

我的 XSLT 模板和函数

    <xsl:variable name="test">  
    <xsl:if test="contains($string,'[')">
        <xsl:variable name="relevant-part" select="substring-before(substring-after($string,'['),']')"/>
        <xsl:variable name="remainder" select="substring-after($string,']')"/>

        <xsl:value-of select="$relevant-part"/>
        <xsl:if test="contains($remainder,'[')">
            <xsl:text disable-output-escaping="yes"> </xsl:text>
        </xsl:if>
        <xsl:call-template name="find-relevant-text">
            <xsl:with-param name="string" select="$remainder"/>
        </xsl:call-template>
    </xsl:if>
    </xsl:variable>


    <xsl:value-of select="myfn:sortCSV($test)"/>
</xsl:template>



<xsl:function name="myfn:sortCSV" as="xs:string*">
    <xsl:param name="csvString" as="xs:string"/>

    <!-- Split up string and remove duplicates -->
    <xsl:variable name="values" select="distinct-values(tokenize($csvString,'\W+\.\W+'))" as="xs:string*"/>
    <!-- Return all elements, sorted -->
    <xsl:for-each select="$values">
        <xsl:sort/>
        <!-- We don't return empty strings -->
        <xsl:sequence select=".[.!='']"/>
    </xsl:for-each>
</xsl:function>

\W+\.\W+ 是我用来识别的正则表达式,例如EG.VISIT 或 ADEG.DTYPE。所以任何模式,包括 CC.CCCC 到 CCCC.CCCCCCCC(其中 C 是一个字符 [A-Z])。

我得到的输出是

EG.VISIT ADEG.DTYPE ADEG.DTYPE ADEG.ADY ADEG.AWTARGET ADEG.AWTDIFF ADEG.DTYPE ADEG.DTYPE

因此没有删除重复项。

问题: 谁能看到我的表达式或代码哪里出了问题?

【问题讨论】:

  • 使用\w+\.\w+\W 匹配非单词字符。 \w 匹配单词字符。最好将其限制为[A-Z]+\.[A-Z]+,因为您说要匹配的项目遵循uppercase+.+uppercase 模式。

标签: regex string xslt tokenize


【解决方案1】:

至于您的正则表达式,请注意\W 匹配非单词字符,不能匹配大写(或小写)字母。 \w 匹配单词字符。

但是,最好将其限制为 [A-Z]+\.[A-Z]+,因为您说要匹配的项目遵循 uppercase+.+uppercase 模式。

regex demo

【讨论】:

    【解决方案2】:

    我会使用analyze-string,或者与 XSLT 2.0 一起使用 XSLT xsl:anyalyze-string,或者与 XSLT 3.0 一起使用同名的函数,使用这种方法是单行的:

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:fn="http://www.w3.org/2005/xpath-functions"
        xmlns:math="http://www.w3.org/2005/xpath-functions/math"
        exclude-result-prefixes="xs math fn"
        version="3.0">
    
        <xsl:template match="column">
            <xsl:value-of select="distinct-values(analyze-string(., '\[([A-Z]+\.[A-Z]+)\]')//fn:match/fn:group[@nr = 1])"/>
        </xsl:template>
    
    </xsl:stylesheet>
    

    输出为EG.VISIT ADEG.DTYPE ADEG.ADY ADEG.AWTARGET ADEG.AWTDIFF

    如果您想对提取的字符串进行排序,请使用&lt;xsl:value-of select="sort(distinct-values(analyze-string(., '\[([A-Z]+\.[A-Z]+)\]')//fn:match/fn:group[@nr = 1]))"/&gt;

    【讨论】:

    • 完美运行。谢谢马丁!
    猜你喜欢
    • 2018-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    • 2020-11-07
    相关资源
    最近更新 更多