0

输入: "abcdef$ghi$jklmno$pqrst$ wx $yx$"

预期输出:

<tokens>
<token>$ghi$</token>
<token>$pqrst</token>
<token>$yx$</token>
</tokens>

根据示例输入字符串,输出必须类似于使用 XSLT 1.0 的预期输出

提前致谢

4

2 回答 2

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>&#10;</xsl:text>
        <xsl:analyze-string select="$input" regex="(\$[a-z]+\$)">
            <xsl:matching-substring>
                <token>
                <xsl:value-of select="regex-group(1)"/>
                </token>
                <xsl:text>&#10;</xsl:text>
            </xsl:matching-substring>
        </xsl:analyze-string>
    </tokens>

</xsl:template>

</xsl:stylesheet>
于 2012-12-17T07:06:30.663 回答
1

对于每对美元符号 (1,2), (3,4), ... (2 × n - 1, 2 × n ),您需要一个标记元素,其文本介于美元符号编号 2 × n - 1 和美元符号数字 2 n

两种情况之一必然适用。

情况 1: n有一些固定的最大值,并且它相对较小(例如,小于 5 或​​ 10)。在这种情况下,一个简单的xs:variable赋值序列加上适当的调用substring-beforesubstring-after足够了,你就完成了。你最终会得到这样的东西:

  • s0是​​原始字符串,s1是s0中第一个美元符号之后的子字符串, t1是s1中第一个美元符号之前的子字符串,r1是s1中第一个美元符号之后的子字符串。
  • 现在让s2r1中第一个美元符号之后的子字符串,t2是s2中第一个美元符号之前的子字符串,r2是s2中第一个美元符号之后的子字符串。
  • 根据需要重复:对于3 到n中的i,设s ir i - 1中第一个美元符号之后的子字符串,t i是s i中第一个美元符号之前的子字符串,而r i是第一个美元之后的子字符串登录s i

情况 2:没有最大值n。在这种情况下,XSLT 1.0 中的直接方法是编写一个命名模板,它 (a) 删除第一个美元符号之前的子字符串,(b) 构造一个token包含美元符号的元素,即第一个美元符号之后和第二个美元之前的字符串符号,并且 (c) 在第二个美元符号之后使用子字符串递归调用自身。为空字符串、带有奇数个美元符号的字符串和其他输入错误添加适当的边界条件,您就完成了。

所以:阅读 XSLT 1.0 的字符串函数并解决您的问题。如果您遇到更多麻烦,请回来(并展示您的工作)。

于 2012-12-15T19:43:01.330 回答