使用XSLT 1.0在两个特殊字符($)之间提取字符串

时间:2012-12-14 15:33:56

标签: xslt-1.0

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

预期产出:

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

根据示例输入字符串,输出必须与使用XSLT 1.0

的预期输出类似

先谢谢

2 个答案:

答案 0 :(得分:1)

对于每对美元符号(1,2),(3,4),...(2× n - 1,2× n )你想要一个令牌元素,其中包含美元符号2× n - 1和美元符号2 n 之间的文本。

两种情况中的一种必然适用。

案例1: n 有一些固定的最大值,它相对较小(比如,小于5或10)。在这种情况下,通过适当调用xs:variablesubstring-before的{​​{1}}分配的简单序列就足够了,您已经完成了。你最终会得到这样的东西:

  • s0 成为原始字符串, s1 s0 t1 中第一个美元符号后的子字符串第一个美元符号在 s1 之前的子字符串, r1 s1 中第一个美元符号之后的子字符串。
  • 现在让 s2 成为 r1 中的第一个美元符号之后的子字符串, t2 中第一个美元符号之前的子字符串s2 r2 s2 中第一个美元符号后的子字符串。
  • 根据需要重复:对于3到 n 中的 i ,让 s i 成为之后的子串第一个美元符号 r i - 1 t i 之前的子字符串第一个美元符号 s i r i 第一个美元符号 s后的子字符串<子> I

案例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>&#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>