Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 如何在xsl:matching子字符串中使用last()?_Xml_Regex_Xpath_Xslt 2.0 - Fatal编程技术网

Xml 如何在xsl:matching子字符串中使用last()?

Xml 如何在xsl:matching子字符串中使用last()?,xml,regex,xpath,xslt-2.0,Xml,Regex,Xpath,Xslt 2.0,有没有办法确定xsl:matching子字符串是否是last()匹配子字符串 示例数据: <data> <value>1 A 1 2 B 2 1 C 3</value> </data> 但是我更喜欢1a12b21c3。有没有办法使用XSLT2.0实现这一点?(我使用Saxon HE作为xslt引擎)。试试看 <xsl:if test="position()!=last()"> 相反试试看 <xsl:if test=

有没有办法确定xsl:matching子字符串是否是
last()
匹配子字符串

示例数据:

<data>
    <value>1 A 1 2 B 2 1 C 3</value>
</data>
但是我更喜欢
1a1
2b2
1c3

。有没有办法使用XSLT2.0实现这一点?(我使用Saxon HE作为xslt引擎)。

试试看

<xsl:if test="position()!=last()">

相反

试试看

<xsl:if test="position()!=last()">


相反,

@Joel_M.Lamsen发现了您代码中的一个bug,但他的解决方案不正确

规范说明:在处理每个子字符串时,子字符串的内容将是上下文项(作为xs:string类型的值);子串在匹配和非匹配子串序列中的位置将是上下文位置;匹配和不匹配子字符串的数量将是上下文大小

所以(position()=last())测试您是否正在处理最后一个子字符串,它可能是匹配的或不匹配的子字符串。如果您在xsl:matching子字符串中,处理最后一个匹配的子字符串,那么(position()=last())将返回false,如果还有一个不匹配的子字符串

由于您对不匹配的子字符串不感兴趣,因此更好的解决方案是使用tokenize():


还请注意我对您的代码所做的一些其他风格改进:

  • 模式//值几乎肯定应该是“值”
  • 用文本结果元素替换xsl:element
  • 不要在除最后一项之外的每项之后插入分隔符,而是在除第一项之外的每项之前插入分隔符。测试一个项目是否是最后一个涉及到前瞻性,这可能是低效的;测试它是否是第一个要简单得多

我也倾向于避免在正则表达式中使用“I”标志;用更大的类别替换
\p{Lu}

@Joel\u M.Lamsen发现了代码中的错误,但他的解决方案不正确

规范说明:在处理每个子字符串时,子字符串的内容将是上下文项(作为xs:string类型的值);子串在匹配和非匹配子串序列中的位置将是上下文位置;匹配和不匹配子字符串的数量将是上下文大小

所以(position()=last())测试您是否正在处理最后一个子字符串,它可能是匹配的或不匹配的子字符串。如果您在xsl:matching子字符串中,处理最后一个匹配的子字符串,那么(position()=last())将返回false,如果还有一个不匹配的子字符串

由于您对不匹配的子字符串不感兴趣,因此更好的解决方案是使用tokenize():


还请注意我对您的代码所做的一些其他风格改进:

  • 模式//值几乎肯定应该是“值”
  • 用文本结果元素替换xsl:element
  • 不要在除最后一项之外的每项之后插入分隔符,而是在除第一项之外的每项之前插入分隔符。测试一个项目是否是最后一个涉及到前瞻性,这可能是低效的;测试它是否是第一个要简单得多

我也倾向于避免在正则表达式中使用“I”标志;用更大的类别替换
\p{Lu}

非常感谢您的宝贵意见!说得很好。谢谢Michael。非常感谢您的宝贵意见!说得很好。谢谢你,迈克尔。
<?xml version="1.0" encoding="UTF-8"?><html xmlns="http://www.w3.org/1999/xhtml">
   <head>
      <meta http-equiv="Content-Type" content="xhtml; charset=UTF-8" />
      <title>xsl:matching-substring problem</title>
   </head>
   <body>
      <h1>xsl:matching-substring problem</h1>
      <p>1 A 1<br />2 B 2<br />1 C 3<br /></p>
   </body>
</html>
<xsl:if test="position()!=last()">
<xsl:template match="value">
    <xhtml:p>
       <xsl:for-each select="tokenize(., '\p{{Nd}}\s\p{{Lu}}\s\p{{Nd}}', 'i')">
          <xsl:if test="position() ne 1"><xhtml:br/></xsl:if> 
          <xsl:value-of select="."/>
        </xsl:for-each>
   </xhtml:p>
</xsl:template>