gpt4 book ai didi

xml - 如何在xsl:matching-substring中使用last()?

转载 作者:行者123 更新时间:2023-12-03 17:03:55 27 4
gpt4 key购买 nike

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

示例数据:

<data>
<value>1 A 1 2 B 2 1 C 3</value>
</data>


示例XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
<xsl:output media-type="xhtml" encoding="UTF-8" />
<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>xsl:matching-substring problem</title>
</head>
<body>
<h1>xsl:matching-substring problem</h1>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="//value">
<xsl:element name="p" namespace="http://www.w3.org/1999/xhtml">
<xsl:analyze-string select="." regex="\p{{Nd}}\s\p{{Lu}}\s\p{{Nd}}" flags="i">
<xsl:matching-substring>
<xsl:value-of select="."/>
<xsl:if test="not(last())">
<xsl:element name="br" namespace="http://www.w3.org/1999/xhtml" />
</xsl:if />
</xsl:matching-substring>
</xsl:analyze-string>
</xsl:element>
</xsl:template>
</xsl:stylesheet>


结果:

<?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 12 B 21 C 3</p>
</body>
</html>


因此,对于第一个和第二个匹配的子字符串, last()似乎也是正确的(实际上, last()似乎返回了匹配的子字符串的最后一个字符的位置)。

没有 xsl:if,我得到:

<?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>


但是我更喜欢 <p>1 A 1<br />2 B 2<br />1 C 3</p>。有没有办法使用XSLT 2.0实现这一目标? (我使用Saxon HE作为xslt引擎)。

最佳答案

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

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

因此(position()= last())测试您是否正在处理最后一个子字符串,该子字符串可以是匹配的子字符串,也可以是不匹配的子字符串。如果您在xsl:matching-substring中,则处理最后一个匹配的子字符串,如果仍然有不匹配的子字符串,则(position()= last())将返回false。

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

<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>


还请注意我对您的代码进行的其他一些样式改进:


模式// value几乎可以肯定只是“ value”
用文字结果元素替换xsl:element
与其在最后一项以外的所有项目之后插入分隔符,不如在第一项之前的所有项目之前插入分隔符。测试项目是否为最后一项涉及前瞻,这可能会导致效率低下;测试是否是第一个要简单得多。


我也倾向于避免在正则表达式中使用'i'标志。而是将 \p{Lu}替换为更大的类别。

关于xml - 如何在xsl:matching-substring中使用last()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25742824/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com