巨大なxslファイルがありますが、「トークン化」を使用してコンマ区切りの文字列を解析するセクションでエラーがスローされます。簡単にするために、トークン化された部分のみをテストするために分解しましたが、進展は見られません。次のエラーが発生し続けます。
表現が期待されます。 tokenize(-> [<-text]、 '、')
他の投稿で共有されているxslの例をいくつか使用してみましたが、うまく機能しませんでした。以下のxslコードが無効である理由を理解するのに苦労しています。とても簡単なことではないようですが、私は単純なものが欠けていると思います。私を正しい方向に導くための助けをいただければ幸いです。
XSL:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/root">
<xsl:for-each select="tokenize([text],',')"/>
<items>
<item>
<xsl:value-of select="."/>
</item>
</items>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
XML:
<?xml-stylesheet type="text/xsl" href="simple.xsl"?>
<root>
<text>Item1, Item2, Item3</text>
</root>
次のようなXML出力を期待しています。
<items>
<item>Item1</item>
<item>Item2</item>
<item>Item3</item>
</items>
ありがとうございました!
DevNullで述べられているように、tokenize()はXSLT2.0関数です。ただし、プロセッサーがEXSLTをサポートしている場合は、 str:tokenize()関数 を使用できます。それ以外の場合は、このようにカンマ区切りの値を分割するためにユーザー再帰が必要になります...
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*" />
<xsl:template match="/">
<items>
<xsl:apply-templates select="root/text"/>
</items>
</xsl:template>
<xsl:template match="text">
<xsl:call-template name="tokenize">
<xsl:with-param name="csv" select="." />
</xsl:call-template>
</xsl:template>
<xsl:template name="tokenize">
<xsl:param name="csv" />
<xsl:variable name="first-item" select="normalize-space(
substring-before( concat( $csv, ','), ','))" />
<xsl:if test="$first-item">
<item>
<xsl:value-of select="$first-item" />
</item>
<xsl:call-template name="tokenize">
<xsl:with-param name="csv" select="substring-after($csv,',')" />
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
私は4つの間違いを見ます:
1.0スタイルシートでtokenize()
を使用しています。バージョンを2.0に変更し、2.0プロセッサを使用する必要があります。 _xml-stylesheet
_処理命令に基づいて、Webブラウザーを使用して変換を行う場合は、おそらく2.0プロセッサーを使用していません。
トークン化の最初の引数(_[text]
_)が無効です。 text
を使用してください。
_xsl:for-each
_を途中で閉じました。
アイテムごとに_<items>
_を出力しています。 _<items>
_を_xsl:for-each
_の外に置きます。
変更の例:
_<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/root">
<items>
<xsl:for-each select="tokenize(text,',')">
<item>
<xsl:value-of select="."/>
</item>
</xsl:for-each>
</items>
</xsl:template>
</xsl:stylesheet>
_
2.0プロセッサで本当に望ましい出力を得るには、_xsl:output
_とnormalize-space()
の使用もお勧めします。
_<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:template match="/root">
<items>
<xsl:for-each select="tokenize(text,',')">
<item>
<xsl:value-of select="normalize-space(.)"/>
</item>
</xsl:for-each>
</items>
</xsl:template>
</xsl:stylesheet>
_