xpath 関数のcontainsを使用する方法がありますが、これにアプローチする 1 つの方法は、 xsl:chooseを使用する代わりに、必要なケースに一致するようにテンプレートを使用することです。したがって、リンク要素を探すことから始めます
<xsl:apply-templates select="link"/>
そして、 @href 属性にコマンが含まれているリンク要素に一致するテンプレートがあります
<xsl:template match="link[contains(@href, ',')]">
他のすべてのリンク要素に一致する、より一般的なテンプレートも必要です。これは、他のより具体的なテンプレートが一致を見つけられなかった場合にのみ一致します
<xsl:template match="link">
たとえば、次の XML について考えてみます。
<root>
<doc>
<link href="http://www.example.com" />
</doc>
<doc>
<link href="http://www.example1.com,http://www.example2.com" />
</doc>
</root>
次の XSLT を適用すると
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:template match="root">
<table>
<tr>
<xsl:apply-templates select="doc"/>
</tr>
</table>
</xsl:template>
<xsl:template match="doc">
<xsl:apply-templates select="link"/>
<xsl:if test="not(link[@href])">
<td>No link</td>
</xsl:if>
</xsl:template>
<xsl:template match="link[contains(@href, ',')]">
<td class="link2">
<xsl:call-template name="link">
<xsl:with-param name="href" select="substring-before(@href, ',')"/>
</xsl:call-template>
<xsl:call-template name="link">
<xsl:with-param name="href" select="substring-after(@href, ',')"/>
</xsl:call-template>
</td>
</xsl:template>
<xsl:template match="link">
<td class="link">
<xsl:call-template name="link"/>
</td>
</xsl:template>
<xsl:template name="link">
<xsl:param name="href" select="@href"/>
<a href="{$href}">
<xsl:copy-of select="$href"/> Link</a>
</xsl:template>
</xsl:stylesheet>
次に、以下が出力されます
<table>
<tr>
<td class="link">
<a href="http://www.example.com"> Link</a>
</td>
<td class="link2">
<a href="http://www.example1.com">http://www.example1.com Link</a>
<a href="http://www.example2.com">http://www.example2.com Link</a>
</td>
</tr>
</table>
これは、コードの重複を避けるために名前付きテンプレートも使用することに注意してください。
編集: @href 属性を持つリンクだけでなく、複数の要素がある場合、それを行う方法はいくつかあります。名前の数が限られている場合は、次のようなことができます
<xsl:apply-templates select="link|website|localpath" />
そして、あなたはこのようにそれらを一致させることができます....
<xsl:template match="link[contains(@href, ',')]|website[contains(@href, ',')]|localpath[contains(@href, ',')]">
<xsl:template match="link|website|website" />
そのように、任意の要素を確認することをお勧めします
<xsl:apply-templates select="*" />
そして、href 属性を持つ要素と持たない要素を照合します。
<xsl:template match="doc/*[contains(@href, ',')]">
<xsl:template match="doc/*">