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

ドル記号(1,2)、(3,4)、...(2× n -1、2× n )の各ペアに対して、ドル記号番号2× n -1との間のテキストを含むトークン要素が必要です。ドル記号番号2n

2つのケースのうちの1つが必ず適用されます。

ケース1: nの固定された最大値があり、それは比較的小さい(たとえば、5または10未満)。この場合、適切な呼び出しを伴う単純な一連の割り当てxs:variableで十分であり、これで完了です。最終的には次のようになります。substring-beforesubstring-after

  • s0を元の文字列、s1をs0最初のドル記号の後の部分文字列、 t1をs1の最初のドル記号の前の部分文字列、r1をs1の最初のドル記号の後の部分文字列とします。
  • ここで、 s2をr1の最初のドル記号の後の部分文字列、t2をs2の最初のドル記号の前の部分文字列、r2をs2の最初のドル記号の後の部分文字列とします。
  • 必要に応じて繰り返します。iが3からnの場合、s iをri -1最初のドル記号の後の部分文字列、t iをsiの最初のドル記号の前の部分文字列、 riを最初のドルの後の部分文字列とします。サインインsi

ケース2:最大nはありません。tokenこの場合、XSLT 1.0の簡単なアプローチは、(a)最初のドル記号の前にサブ文字列をドロップし、(b)ドル記号、最初のドル記号の後、2番目のドルの前の文字列を含む要素を作成する名前付きテンプレートを作成することです。記号、および(c)2番目のドル記号の後のサブストリングを使用して自分自身を再帰的に呼び出します。空の文字列、ドル記号の数が奇数の文字列、およびその他の入力エラーに適切な境界条件を追加すれば、完了です。

つまり、XSLT 1.0の文字列関数を読んで、問題を解決してください。さらに問題が発生した場合は、戻ってきて(そしてあなたの作品を見せて)ください。

于 2012-12-15T19:43:01.330 に答える
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 に答える