0

XSLT 2 および 3の文字列内のすべての数値を検索する方法には、いくつかの優れた解決策があります。 XSLT 1(EXSLT の可能な助けを借りて)の制限内でまったく同じことを達成するにはどうすればよいですか?

次に例を示します。

<data>
  <sig>NL Mellin 1-1 36</sig>
  <sig>NL Mellin 1-1 38</sig>
  <sig>NL Mellin 1-10 02</sig>
  <sig>NL Mellin 1-10 04</sig>
  <sig>NL Mellin 1-10 09</sig>
</data>

望ましい出力は次のようになります。

1 1 36
1 1 38
1 10 02
1 10 04
1 10 09
4

1 に答える 1

1

このようにしてみてください:

XSLT1.0

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="utf-8" />

<xsl:template match="/">
    <xsl:for-each select="data/sig">
        <xsl:call-template name="tokenize">
            <xsl:with-param name="text" select="translate(., '-', ' ')"/>
        </xsl:call-template>
        <xsl:if test="position()!=last()">
            <xsl:text>&#10;</xsl:text>
        </xsl:if>
    </xsl:for-each>
</xsl:template>

<xsl:template name="tokenize">
    <xsl:param name="text"/>
    <xsl:param name="delimiter" select="' '"/>
        <xsl:variable name="token" select="substring-before(concat($text, $delimiter), $delimiter)" />
        <xsl:if test="$token = translate($token, translate($token, '0123456789', ''), '')">
                <xsl:value-of select="$token"/>
                <xsl:text> </xsl:text>
        </xsl:if>
        <xsl:if test="contains($text, $delimiter)">
            <!-- recursive call -->
            <xsl:call-template name="tokenize">
                <xsl:with-param name="text" select="substring-after($text, $delimiter)"/>
            </xsl:call-template>
        </xsl:if>
</xsl:template>

</xsl:stylesheet>

:

  1. 複数の区切り文字がある場合は、それらを共通の文字 (私の例ではスペース) に変換する必要があります。

  2. 各行の末尾のスペースは削除しませんでした。

  3. プロセッサが EXSLT str:tokenize() 関数をサポートしている場合、これはより簡単になる可能性があります。

于 2014-12-18T11:09:21.373 に答える