0

xml で xsl を使用して xml を作成しています

XMLのコードは次のとおりです

<?xml version="1.0" encoding="utf-8"?>
<example>
<sample>245 34</sample>
<sample1>24 36</sample1>
</example>

XSL の助けを借りて、xml 値を分割したい

Google でチェックしているときに、substring-before または substring-after(query) を使用できる方法があることがわかりました

しかし、私は以下のような値をもたらす方法を少し混乱させています

<example>
<text>245</text>
<text>34</text
<text>24</text>
<text>36</text>
</example>

上記の値をもたらす方法を教えてください。

ありがとうございます

4

1 に答える 1

0

この状況で最も簡単なのは、スペース区切り文字で分割することです。XSLT 1.0 に制限されている場合、これを行う最も簡単な方法は、EXSLT ライブラリを使用することです (これは、PHP などの多くの XSLT 実装でデフォルトで利用可能です)。

この XMLPlaygroundで以下を実行できます(出力ソースを参照)。

<!-- root -->
<xsl:template match='/'>
    <example>
        <xsl:apply-templates select='*' />
    </example>
</xsl:template>

<!-- match sample nodes -->
<xsl:template match="example/*">
    <xsl:apply-templates select='str:split(., " ")' />
</xsl:template>

<!-- match token nodes (from EXSLT split()) -->
<xsl:template match='token'>
    <text><xsl:value-of select='.' /></text>
</xsl:template>

Playground に示されているように、EXSLT を使用するには (利用可能な場合)、開始xsl:stylesheetタグでその名前空間を宣言する必要があります。たとえば、その文字列ライブラリを使用するには (ここでは を利用するためにsplit())、次のように入力します。

xmlns:str="http://exslt.org/strings"
extension-element-prefixes="str"

[編集] -部分文字列アプローチを主張する場合、これは可能ですが、ノードセットを生成する機能がなく(EXSLTがsplit()行うことです)、そのノードセットにテンプレートを適用することができないため、より長くなります。あなたがバッグに持っているトリックは再帰です - 1 つのテンプレートがその中のスペースの機能と同じ回数自分自身を呼び出します。

これは、この (別の) XMLPlaygroundで実行できます。

<!-- root child nodes -->
<xsl:template match='example/*'>
    <xsl:call-template name='output'>
        <xsl:with-param name='source' select='.' />
    </xsl:call-template>
</xsl:template>


<!-- output - expects two params: -->
<!-- @output_str - the sub-string to output to a <text> node this time (has value only on self-call, i.e. recursion -->
<!-- @source - the source string on which to recurse, for more spaces in the string -->

<xsl:template name='output'>

    <xsl:param name='output_str' />
    <xsl:param name='source' />

    <!-- output something this time? -->
    <xsl:if test='$output_str'>
        <text><xsl:value-of select='$output_str' /></text>
    </xsl:if>

    <!-- recurse... -->
    <xsl:if test='$source'>
        <xsl:choose>

            <!-- $source contains spaces - act on the string before the next space -->
            <xsl:when test='contains($source, " ")'>
                <xsl:call-template name='output'>
                    <xsl:with-param name='output_str' select='substring-before($source, " ")' />
                    <xsl:with-param name='source' select='substring-after($source, " ")' />
                </xsl:call-template>
            </xsl:when>

            <!-- source doesn't contain spaces - act on it in its entirety -->
            <xsl:otherwise>
                <xsl:call-template name='output'>
                    <xsl:with-param name='output_str' select='$source' />
                </xsl:call-template>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:if>
</xsl:template>
于 2012-07-05T20:37:16.153 に答える