2017-07-18 32 views
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>第二和第三的<UseCode>

非常感謝您的反饋。

回答

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

+0

感謝您的反饋。 – user7918368

0

您可以取代你的analyze-string如果分隔符是/字符如下:

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

這裏,(.+?)/做一個懶惰尋找一個/以前匹配的字符集。並且/|$將考慮斜線後的最後一個令牌,因爲$表示字符串的結尾。

+0

感謝您的反饋。 – user7918368

1

無需analyze-string這裏,tokenize()將工作細

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

而重要的區別是...? –

+0

對不起,我錯過了你的答案。不知道如何。 –

+0

感謝您的反饋。 – user7918368

相關問題