次のような xml で動作する汎用 XSLT 2.0 関数を作成したいと思います。
<?xml version="1.0"?>
<foo xmlns:my="http://meohmy.org" xmlns:yours="http://meohmy2.org">
<yours:pet my:type="dog" my:color="red">Cindy</yours:pet>
<yours:pet my:type="cat">Felix</yours:pet>
<yours:pet my:type="cat" my:color="green">Pai Mei</yours:pet>
</foo>
次のような関数シグネチャが与えられます。
my:doit('item',/foo/yours:/pet,@my:color)
(最初の引数はラベルで、2 番目は報告したいノードセットで、3 番目は 2 番目の引数のノードセット内のノードごとに出力したい値です。それがあるかどうかは関係ありません)。
次のようなデータを返します。
info=red;;green
問題の 3 番目の引数のない要素に対応する空のプレースホルダーが必要であり、順序が重要であることに注意してください。
スタイルシートでこれを何度も (さまざまな理由で何十回も) 行っているため、関数を使用するのが自然な方法のように思えました。これは私がこれまでに思いついたものです...
<?xml version="1.0"?>
<xsl:stylesheet version="2.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="http://meohmy.org"
xmlns:yours="http://meohmy2.org">
<xsl:template match="/">
<xsl:value-of select="my:doit('item',/foo/yours:pet,@my:color)"/>
</xsl:template>
<xsl:function name="my:doit" as="xs:string?">
<xsl:param name="item" as="xs:string"/>
<xsl:param name="value"/>
<xsl:param name="subvalue"/>
<xsl:if test="$value">
<xsl:value-of>
<xsl:value-of select="$item"/>
<xsl:text>=</xsl:text>
<xsl:for-each select="$value">
<xsl:value-of select="current()/$subvalue"/>
<xsl:if test="position() != last()">
<xsl:text>;</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:value-of>
</xsl:if>
</xsl:function>
</xsl:stylesheet>
ただし、これを行うと、関数 doit() から次の値を取得します。
item=;;
<xsl:value-of select="current()/$subvalue"/>
これは、スタイルシートで が正しくないことを示唆しています。私は近くにいます、私はそれを感じることができます;>何か提案はありますか?
ありがとう!