首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >regex包含错误的输出。

regex包含错误的输出。
EN

Stack Overflow用户
提问于 2016-08-04 10:50:23
回答 2查看 39关注 0票数 1

我有以下XML代码。

代码语言:javascript
复制
 <pgs>IVA.004, 168IA.002</pgs>

我正在尝试在.之前获取数据,并使用regex编写匹配。下面是我的XSLT。

代码语言:javascript
复制
<xsl:template match="pgs">
        <td class="pgs">
            <xsl:analyze-string select="." regex="([\w]+)\.([\w]+)">
                <xsl:matching-substring>
                    <xsl:variable name="nonStringFirstNum" select="number(translate(regex-group(1),'ABCDEFGHIJKLMNOPQRSTUVWXYZ',''))"/>
                    <xsl:variable name="nonStringSecondNum" select="number(translate(regex-group(3),'ABCDEFGHIJKLMNOPQRSTUVWXYZ',''))"/>
                    <xsl:variable name="refVar">
                        <xsl:choose>
                            <xsl:when test="matches(regex-group(1),'XV') or matches(regex-group(1),'Sch') or ($nonStringFirstNum > 367)">
                                <xsl:value-of select="concat('er:#Link_PT_15/P',regex-group(1),'-',regex-group(2))"/>
                            </xsl:when>
                            <xsl:when test="matches(regex-group(1),'XIII') or ($nonStringFirstNum > 348 and $nonStringFirstNum &lt; 361)">
                                <xsl:value-of select="concat('er:#Link_PT_13/P',regex-group(1),'-',regex-group(2))"/>
                            </xsl:when>
                            <xsl:when test="matches(regex-group(1),'XII') or ($nonStringFirstNum > 341 and $nonStringFirstNum &lt; 344)">
                                <xsl:value-of select="concat('er:#Link_PT_12/P',regex-group(1),'-',regex-group(2))"/>
                            </xsl:when>
                            <xsl:when test="matches(regex-group(1),'X') or ($nonStringFirstNum > 325 and $nonStringFirstNum &lt; 332)">
                                <xsl:value-of select="concat('er:#Link_PT_10/P',regex-group(1),'-',regex-group(2))"/>
                            </xsl:when>
                            <xsl:when test="matches(regex-group(1),'IX') or ($nonStringFirstNum > 323 and $nonStringFirstNum &lt; 326)">
                                <xsl:value-of select="concat('er:#Link_PT_09/P',regex-group(1),'-',regex-group(2))"/>
                            </xsl:when>
                            <xsl:when test="matches(regex-group(1),'VIII') or ($nonStringFirstNum > 306 and $nonStringFirstNum &lt; 310)">
                                <xsl:value-of select="concat('er:#Link_PT_08/P',regex-group(1),'-',regex-group(2))"/>
                            </xsl:when>
                            <xsl:when test="matches(regex-group(1),'VII') or ($nonStringFirstNum > 305 and $nonStringFirstNum &lt; 307)">
                                <xsl:value-of select="concat('er:#Link_PT_07/P',regex-group(1),'-',regex-group(2))"/>
                            </xsl:when>
                            <xsl:when test="matches(regex-group(1),'VI') or ($nonStringFirstNum > 296 and $nonStringFirstNum &lt; 303)">
                                <xsl:value-of select="concat('er:#Link_PT_06/P',regex-group(1),'-',regex-group(2))"/>
                            </xsl:when>
                            <xsl:when test="matches(regex-group(1),'V') or ($nonStringFirstNum > 168 and $nonStringFirstNum &lt; 297)">
                                <xsl:value-of select="concat('er:#Link_PT_05/P',regex-group(1),'-',regex-group(2))"/>
                            </xsl:when>
                            <xsl:when test="matches(regex-group(1),'IV') or ($nonStringFirstNum > 114 and $nonStringFirstNum &lt; 169)">
                                <xsl:value-of select="concat('er:#Link_PT_04/P',regex-group(1),'-',regex-group(2))"/>
                            </xsl:when>
                            <xsl:when test="matches(regex-group(1),'II') or ($nonStringFirstNum > 36 and $nonStringFirstNum &lt; 80)">
                                <xsl:value-of select="concat('er:#Link_PT_02/P',regex-group(1),'-',regex-group(2))"/>
                            </xsl:when>
                            <xsl:when test="matches(regex-group(1),'LT') or ($nonStringFirstNum >= 0 and $nonStringFirstNum &lt; 3)">
                                <xsl:value-of select="concat('er:#Link_PT_01/P',regex-group(1),'-',regex-group(2))"/>
                            </xsl:when>
                            <xsl:otherwise>
                                <xsl:value-of select="concat('er:#Link_CH_02/P',regex-group(1),'-',regex-group(2))"/>
                            </xsl:otherwise>
                        </xsl:choose>
                    </xsl:variable>
                    <a href="{$refVar}">
                        <xsl:value-of select="."/>
                    </a>
                </xsl:matching-substring>
                <xsl:non-matching-substring>
                    <xsl:value-of select="."/>
                </xsl:non-matching-substring>
            </xsl:analyze-string>
        </td>
    </xsl:template>

当我运行这个IVA.004时,它给我的输出是<a href="er:#Link_PT_05/PIVA-004">IVA.004</a>而不是<a href="er:#Link_PT_04/PIVA-004">IVA.004</a>。请让我知道我哪里出了问题,以及如何解决这个问题。这是一把有用的小提琴。

http://xsltransform.net/jz1PuNJ

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-04 11:56:10

在xsl: return中,首先可能的xsl:when条件只首先返回。也就是说,“matches(regex-group(1),‘V”)将首先返回,因为表达式包含'V',我的意思是'IVA.004’包含'V',没有机会检查下一个xsl:时,因为在成功的条件下,控制将退出进一步的检查。

更改xsl: the命令,如下所示。

代码语言:javascript
复制
<xsl:when test="matches(regex-group(1),'IV') or ($nonStringFirstNum > 114 and $nonStringFirstNum &lt; 169)">
    <xsl:value-of select="concat('er:#Link_PT_04/P',regex-group(1),'-',regex-group(2))"/>
</xsl:when><!--Keep this xsl:when first-->
<xsl:when test="matches(regex-group(1),'V') or ($nonStringFirstNum > 168 and $nonStringFirstNum &lt; 297)">
    <xsl:value-of select="concat('er:#Link_PT_05/P',regex-group(1),'-',regex-group(2))"/>
</xsl:when><!--Keep this xsl:when next-->

很少有更多的xsl:时,订单也需要更改如下

代码语言:javascript
复制
<xsl:when test="matches(regex-group(1),'IX') or ($nonStringFirstNum > 323 and $nonStringFirstNum &lt; 326)">
    <xsl:value-of select="concat('er:#Link_PT_09/P',regex-group(1),'-',regex-group(2))"/>
</xsl:when>
<xsl:when test="matches(regex-group(1),'X') or ($nonStringFirstNum > 325 and $nonStringFirstNum &lt; 332)">
    <xsl:value-of select="concat('er:#Link_PT_10/P',regex-group(1),'-',regex-group(2))"/>
</xsl:when>
票数 1
EN

Stack Overflow用户

发布于 2016-08-04 11:50:21

字符串IVA.004'V''IV'匹配,在xsl:choose/xsl:when中使用第一个真正的xsl:when,因此需要更改xsl:choose的顺序。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38765308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档