2013-12-18 57 views
1

我有代码字符串模式正确

<page>U1/68/5, U1/73/2, V1/65B/43, V5/4E/8E</page> 

以下XML块,我想下面的XSLT。

<xsl:template match="page"> 
     <xsl:analyze-string select="." regex="([a-zA-Z][0-9]+)/([(0-9)]+[a-zA-Z]{0,1})/([(0-9)]+[a-zA-Z]{0,1})"> 
      <xsl:matching-substring> 
      <a 
       href="{concat('er:#HKWBV3_PT_',regex-group(1),'/',regex-group(1),'-',regex-group(2),'-',regex-group(3))}"> 
       <xsl:value-of select="."/> 
      </a> 
      </xsl:matching-substring> 
      <xsl:non-matching-substring> 
       <xsl:value-of select="."/> 
      </xsl:non-matching-substring> 
     </xsl:analyze-string>  
</xsl:template> 

当我使用上述XSLT,<xsl:non-matching-substring>块获取调用和当我试图在regexpal.com同一正则表达式,条件被接受。请让我知道我的REGEXmatch在哪里出错。

感谢

+0

是否有充分的理由使用'{0,1}'而不是标准正则表达式?'“匹配零或一次”? (虽然它不应该导致你的问题。) – usr2564301

+0

嗨@Jongware,感谢您的回应,你要我用'?'替换'{0,1}' – user2423959

回答

3

正如我怀疑,{0,1}是问题的原因 - 但不是我想的原因吧!

http://www.w3.org/TR/xslt20/#analyze-string

注:

由于正则表达式属性是属性值模板,正则表达式内的大括号必须加倍。例如,要匹配1到5个字符的序列,请写regex=".{{1,5}}"。对于包含许多大括号的正则表达式,使用regex="{'[0-9]{1,5}[a-z]{3}[0-9]{1,2}'}"等符号或使用变量可能更方便。

由于您在这里只使用{0,1},您可以改为使用单个?,但当然这并不总是一个选项。

+0

嗨@Jongware基于你的建议我试了下面的REGEX' (U1/2/2)上的[[AZ] [0-9] +)/([(0-9)] + \ w +?)/([(0-9)] + [\ w + 6',它不工作,请让我知道我哪里错了。谢谢 – user2423959

+0

@ user2423959:我建议的所有内容都是用'?'替换'{0,1}'。你的正则表达式在TextPad中有效,但也许XSLT2不喜欢你的反斜杠(这些都是新的,并且不在原始中)。尽管如此..请尽量留在话题上。这个答案是否解决你的*原始问题? – usr2564301

+0

实际上,我在评论中提到的字符串是需要匹配的新字符串模式,反斜杠用于模式匹配。 – user2423959