我需要获取每个'/'的值,但由于文件中包含的特殊字符,我无法获得正确的输出。如何在检查中使用正确的正则表达式?我使用<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个正则表达式。
提前感谢您的反馈。
答案 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>
答案 1 :(得分: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>
答案 2 :(得分:0)
如果分隔符为analyze-string
字符,则可以使用以下内容替换/
:
<xsl:analyze-string select="normalize-space()" regex="(.+?)/(.+?)/(.+?)(/|$)" >
此处,(.+?)/
执行与/
之前的一组字符匹配的延迟搜索。并且/|$
将考虑斜杠后的最后一个标记,因为$
表示字符串的结尾。