如何使用正确的正则表达式

时间:2017-07-18 00:14:45

标签: xml xslt xslt-2.0

我需要获取每个'/'的值,但由于文件中包含的特殊字符,我无法获得正确的输出。如何在检查中使用正确的正则表达式?我使用<xsl:analyze-string>元素来获取值。这是我的示例文件:

INPUTFILE:

<Communication>
   <DialNumber>Phone/+31-3424-27385/null/Phone/+06-32-7890-565/Mobile(Office)/null/+313-(424)-28500/Fax</DialNumber>
</Communication>

预期输出

<Communication>
   <ChannelCode>Phone</ChannelCode>
   <UseCode>null</UseCode>
   <DialNumber>+31-3424-27385</DialNumber>
</Communication>
<Communication>
   <ChannelCode>Phone</ChannelCode>
   <UseCode>Mobile(Office)</UseCode>
   <DialNumber>+06-32-7890-565</DialNumber>
</Communication>
<Communication>
   <ChannelCode>null</ChannelCode>
   <UseCode>Fax</UseCode>
   <DialNumber>+313-(424)-28500</DialNumber>
</Communication>

XSLTCode

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
   </xsl:template>
    <xsl:template match="DialNumber">
    <xsl:analyze-string select="normalize-space()" regex="(\w+)/(\w+)/(\w+)">
        <xsl:matching-substring>
            <Communication>
                    <ChannelCode>
                        <xsl:value-of select="regex-group(1)"/>
                    </ChannelCode>
                    <UseCode>
                        <xsl:value-of select="regex-group(3)"/>
                    </UseCode>
                <DialNumber>
                    <xsl:value-of select="regex-group(2)"/>
                </DialNumber>
            </Communication>
        </xsl:matching-substring>
    </xsl:analyze-string>
</xsl:template>
</xsl:stylesheet>

我需要检查'/'之后的前3个单词和后3个单词,以及最后3个单词。它看起来像这样:

Phone/+31-3424-27385/null

Phone/+06-32-7890-565/Mobile(Office)

null/+313-(424)-28500/Fax

我需要在<Channel>分配的第一个正则表达式,<DialNumber>中的第2个和<UseCode>中的第3个正则表达式。

提前感谢您的反馈。

3 个答案:

答案 0 :(得分:1)

如果 - 看起来 - 你的输入是以三个为一组进行组织的,你可以做到:

<xsl:template match="Communication">
    <xsl:for-each-group select="tokenize(DialNumber, '/')" group-by="(position()-1) idiv 3">
        <Communication>
            <ChannelCode>
                <xsl:value-of select="current-group()[1]" />
            </ChannelCode>
            <UseCode>
                <xsl:value-of select="current-group()[3]" />
            </UseCode>
            <DialNumber>
                <xsl:value-of select="current-group()[2]" />
            </DialNumber>
        </Communication>        
    </xsl:for-each-group>
</xsl:template>

演示:http://xsltransform.net/3MvmrA5/1

答案 1 :(得分:1)

此处不需要analyze-stringtokenize()可以正常使用

<xsl:variable name="tokens" select="tokenize(., '/')"/>
<xsl:for-each-group select="$tokens" group-adjacent="(position()-1) idiv 3">
        <Communication>
            <ChannelCode>
                <xsl:value-of select="current-group()[1]" />
            </ChannelCode>
            <UseCode>
                <xsl:value-of select="current-group()[3]" />
            </UseCode>
            <DialNumber>
                <xsl:value-of select="current-group()[2]" />
            </DialNumber>
        </Communication>
</xsl:for-each-group> 

答案 2 :(得分:0)

如果分隔符为analyze-string字符,则可以使用以下内容替换/

<xsl:analyze-string select="normalize-space()" regex="(.+?)/(.+?)/(.+?)(/|$)" >

此处,(.+?)/执行与/之前的一组字符匹配的延迟搜索。并且/|$将考虑斜杠后的最后一个标记,因为$表示字符串的结尾。