输入:"abcdef$ghi$jklmno$pqrst$ wx $yx$"
预期产出:
<tokens>
<token>$ghi$</token>
<token>$pqrst</token>
<token>$yx$</token>
</tokens>
根据示例输入字符串,输出必须与使用XSLT 1.0
的预期输出类似先谢谢
答案 0 :(得分:1)
对于每对美元符号(1,2),(3,4),...(2× n - 1,2× n )你想要一个令牌元素,其中包含美元符号2× n - 1和美元符号2 n 之间的文本。
两种情况中的一种必然适用。
案例1: n 有一些固定的最大值,它相对较小(比如,小于5或10)。在这种情况下,通过适当调用xs:variable
和substring-before
的{{1}}分配的简单序列就足够了,您已经完成了。你最终会得到这样的东西:
案例2:没有最大 n 。在这种情况下,XSLT 1.0中的直接方法是编写一个命名模板,其中(a)在第一个美元符号之前删除子字符串,(b)构造包含美元符号的substring-after
元素,第一个美元之后的字符串符号和第二个美元符号之前,(c)在第二个美元符号后用子串递归调用自身。为空字符串,带有奇数美元符号的字符串和其他输入错误添加适当的边界条件,您就完成了。
所以:请阅读XSLT 1.0的字符串函数并解决您的问题。如果你有进一步的麻烦,请回来(并展示你的工作)。
答案 1 :(得分:1)
希望以下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>