XHTML 出力を生成するために XSLT ファイルで使用する次の XSLT 関数があります。
<xsl:function name="local:if-not-empty">
<xsl:param name="prefix"/>
<xsl:param name="str"/>
<xsl:param name="suffix"/>
<xsl:if test="$str != ''"><xsl:value-of select="concat($prefix, $str, $suffix)"/></xsl:if>
</xsl:function>
文字列が空でないかどうかを単純にチェックstr
し、空である場合は、プレフィックスとサフィックスで連結された文字列を返します。
単純な文字列のみを渡す限り、関数は正常に機能します。しかし、HTML 要素を接頭辞または接尾辞として渡そうとすると、次のようになります。
<xsl:value-of select="local:if-not-empty('', /some/xpath/expression, '<br/>')"/>
次のエラー メッセージが表示されます。
SXXP0003: Error reported by XML parser: The value of attribute "select"
associated with an element type "null" must not contain the '<' character.
次に試したのは、変数を定義することでした。
<xsl:variable name="br"><br/></xsl:variable>
そしてそれを関数に渡します:
<xsl:value-of select="local:if-not-empty('', /some/xpath/expression, $br)"/>
ただし、ここではもちろん、要素自体がコピーされるのではなく、要素の値が抽出されるため、空の文字列が得られます。
私の最後の絶望的な試みは、変数でテキスト要素を定義することでした:
<xsl:variable name="br">
<xsl:text disable-output-escaping="yes"><br/></xsl:text>
</xsl:variable>
これを関数に渡しますが、これも許可されていませんでした。
XTSE0010: xsl:text must not contain child elements
私はおそらく XSLT の複雑な内部動作を理解していませんが、私の意見では<br/>
、ジェネリック関数を介して XSLT 変換内に要素を追加することは正当に思えます...
とにかく...誰かが私に別の解決策を教えていただければ幸いです。また、なぜこれが機能しないのかを理解したいと思います...
PS: 私は Saxon-HE 9.4.0.1J、Java バージョン 1.6.0_24 を使用しています。