输入:"abcdef$ghi$jklmno$pqrst$ wx $yx$"
预期输出:
<tokens>
<token>$ghi$</token>
<token>$pqrst</token>
<token>$yx$</token>
</tokens>
根据示例输入字符串,输出必须与使用XSLT1.0的预期输出类似
提前感谢
对于每对美元符号(1,2),(3,4)。。。(2×n-1,2&timers;n)您想要一个令牌元素,其文本介于美元符号编号2×之间n-1和美元符号号2n。
两种情况中的一种必然适用。
情况1:n存在一些固定的最大值,并且它相对较小(例如,小于5或10)。在这种情况下,一个简单的xs:variable
分配序列以及对substring-before
和substring-after
的适当调用就足够了,您就完成了。你最终会得到这样的东西:
- 设s0为原始字符串,s1是s 0中第一个美元符号之后的子字符串,t1在s1中第一个$符号之前的子字符串;r1则是s1
- 现在,让s2是r1中第一个美元符号之后的子字符串,t2为s2第一个美元标志之前的子字符串
- 根据需要重复:对于3到n中的i,让si是ri-1中第一个美元符号之后的子字符串,ti是si第一个美元标志之前的子字符串。si
情况2:没有最大n。在这种情况下,XSLT1.0中的直接方法是编写一个命名模板,该模板(a)将子字符串放在第一个美元符号之前,(b)构造一个包含美元符号的token
元素,第一个美元标志之后和第二个美元标志之前的字符串,和(c)用第二个美元符号后的子字符串递归调用自己。为空字符串、带有奇数美元符号的字符串和其他输入错误添加适当的边界条件,就完成了。
所以:阅读XSLT1.0的字符串函数并解决您的问题。如果你还有麻烦,就回来(展示你的作品)。
希望下面的xsl对您有所帮助。它有效。我自己试过了。
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes"/>
<xsl:template match="/">
<xsl:variable name="input">
<xsl:text>abcdef$ghi$jklmno$pqrst$ wx$yx$</xsl:text>
</xsl:variable>
<tokens>
<xsl:text> </xsl:text>
<xsl:analyze-string select="$input" regex="($[a-z]+$)">
<xsl:matching-substring>
<token>
<xsl:value-of select="regex-group(1)"/>
</token>
<xsl:text> </xsl:text>
</xsl:matching-substring>
</xsl:analyze-string>
</tokens>
</xsl:template>
</xsl:stylesheet>