Xml 如何在xsl:matching子字符串中使用last()?
有没有办法确定xsl:matching子字符串是否是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=
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>