当前位置: 首页 > 知识库问答 >
问题:

XSL分析字符串->将子字符串匹配到多个变量中

唐弘益
2023-03-14

我想知道是否可以使用analysting-string并在RegEx中设置多个组,然后将所有匹配的组存储在变量中以供以后使用。

像这样:

<xsl:analyze-string regex="^Blah\s+(\d+)\s+Bloo\s+(\d+)\s+Blee" select=".">
  <xsl:matching-substring>
    <xsl:variable name="varX">
      <xsl:value-of select="regex-group(1)"/>
    </xsl:variable>                                
    <xsl:variable name="varY">
      <xsl:value-of select="regex-group(2)"/>
    </xsl:variable>        
  </xsl:matching-substring>
</xsl:analyze-string>    

这实际上不起作用,但这正是我想要的,我知道我可以将分析字符串封装在一个变量中,但这似乎很愚蠢,因为对于每个我必须处理正则表达式的组,效率不是很高,我应该能够处理正则表达式一次,并存储所有组以供以后使用。

有什么想法吗?

共有2个答案

施琦
2023-03-14

这种转换表明,为了获得所需的结果,不需要xsl:analyze-string,而是存在一种更简单、通用的解决方案

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="*[matches(., '^Blah\s+(\d+)\s+Bloo\s+(\d+)\s+Blee')]">

    <xsl:variable name="vTokens" select=
      "tokenize(replace(., '^Blah\s+(\d+)\s+Bloo\s+(\d+)\s+Blee', '$1 $2'), ' ')"/>

  <xsl:variable name="varX" select="$vTokens[1]"/>  
  <xsl:variable name="varY" select="$vTokens[2]"/>  

  <xsl:sequence select="$varX, $varY"/>
 </xsl:template>
</xsl:stylesheet>

当应用于此XML文档时:

<t>Blah  123   Bloo  4567  Blee</t>

产生想要的正确结果:

123 4567

在这里,我们不依赖于知道RegEx(可以作为参数提供)和字符串——我们只需将字符串替换为RegEx组的分隔字符串,然后我们对其进行标记,并且Tokenize()生成的序列中的每个项目都可以很容易地分配给相应的变量

我们不必在临时文件中找到想要的结果。树——我们只是把它们都放在一个结果序列中。

燕嘉熙
2023-03-14

很好

<xsl:variable name="groups" as="element(group)*">
<xsl:analyze-string regex="^Blah\s+(\d+)\s+Bloo\s+(\d+)\s+Blee" select=".">
<xsl:matching-substring>
  <group>
     <x><xsl:value-of select="regex-group(1)"/></x>
     <y><xsl:value-of select="regex-group(2)"/></y>
  </group>   
</xsl:matching-substring>
</xsl:analyze-string>
</xsl:variable>

帮助?这样您就有了一个名为group的变量,它是带有捕获的group元素的序列。

 类似资料:
  • 例如,我们有一个字符串:asd/asd/asd/1#s_ 我需要匹配以下部分:/asd/1#s_或asd/1#s_如何使用普通正则表达式? 我试过像这样的消极前瞻,但它不起作用 它匹配这个“前缀/asd/1#s_”,我需要匹配“/asd/1#s_”中的这个“/asd/1#”,我需要匹配“/asd/1#s_”,而没有所有前面的 /asd/'s 匹配应该与普通正则表达式没有任何编程语言的任何帮助函数h

  • 问题 你想要匹配两个或多个字符串。 解决方案 计算把一个字符串转换成另一个字符串所需的编辑距离或操作数。 levenshtein = (str1, str2) -> l1 = str1.length l2 = str2.length prevDist = [0..l2] nextDist = [0..l2] for i in [1..l1] by 1

  • 如何将过滤器列表拆分为单个过滤器元件?split2String在线程“main”java.util.regex中导致:异常。PatternSyntaxException:索引10或(|和)附近的未闭合组(

  • 我有一个逗号分层的字符串,当调用时,它返回大约60的数组大小。在特定的用例中,我只需要从数组中返回第二个值的值。例如,

  • 问题内容: 我想同时执行完全的单词匹配和部分的单词/子字符串匹配。例如,如果我搜索“男士剃须刀”,那么我应该能够在结果中找到“男士剃须刀”。但是,如果我搜索“剃须刀”,那么在结果中我也应该能够找到“剃须刀”。我使用以下设置和映射: 索引设置: 对应: 插入记录: 查询: 1.按完全匹配的词组进行搜索- >“男式” 上面的查询在返回结果中返回“男士剃须刀”。 2.按部分单词匹配搜索- >“ en’s

  • 问题内容: 我发现能够在运行时创建新变量并创建结果字典以供以后处理(即写入文件)非常有用。 这将创建字典条目[result1:data1],我可以使用myDict [result1]对其进行调用。我一直在使用vars()而不真正了解我在做什么。我认为它返回带有局部变量(?)的字典,并且 vars()[x] = y 创建一个新的[x:y]字典条目? 我有一个脚本,其中传递了一个用{input1:da