私は次のテンプレートを持っています
<h2>one</h2>
<xsl:apply-templates select="one"/>
<h2>two</h2>
<xsl:apply-templates select="two"/>
<h2>three</h2>
<xsl:apply-templates select="three"/>
対応するテンプレートのメンバーが少なくとも1つある場合にのみ、ヘッダー(1、2、3)を表示したいと思います。これを確認するにはどうすればよいですか?
<xsl:if test="one">
<h2>one</h2>
<xsl:apply-templates select="one"/>
</xsl:if>
<!-- etc -->
または、名前付きテンプレートを作成することもできます。
<xsl:template name="WriteWithHeader">
<xsl:param name="header"/>
<xsl:param name="data"/>
<xsl:if test="$data">
<h2><xsl:value-of select="$header"/></h2>
<xsl:apply-templates select="$data"/>
</xsl:if>
</xsl:template>
次に、次のように呼び出します。
<xsl:call-template name="WriteWithHeader">
<xsl:with-param name="header" select="'one'"/>
<xsl:with-param name="data" select="one"/>
</xsl:call-template>
しかし、正直なところ、それは私にはもっと手間がかかるように見えます...ヘッダーの描画が複雑な場合にのみ役立ちます...単純な場合は、<h2>...</h2>
インラインのままにしておきたいと思います。
ヘッダータイトルが常にノード名である場合は、「$ header」引数を削除してテンプレートを簡略化し、代わりに次を使用できます。
<xsl:value-of select="name($header[1])"/>
私は XSL の機能的な側面を試したいと思っており、それが次の実装につながっています。
<?xml version="1.0" encoding="UTF-8"?>
<!-- test data inlined -->
<test>
<one>Content 1</one>
<two>Content 2</two>
<three>Content 3</three>
<four/>
<special>I'm special!</special>
</test>
<!-- any root since take test content from stylesheet -->
<xsl:template match="/">
<html>
<head>
<title>Header/Content Widget</title>
</head>
<body>
<xsl:apply-templates select="document('')//test/*" mode="header-content-widget"/>
</body>
</html>
</xsl:template>
<!-- default action for header-content -widget is apply header then content views -->
<xsl:template match="*" mode="header-content-widget">
<xsl:apply-templates select="." mode="header-view"/>
<xsl:apply-templates select="." mode="content-view"/>
</xsl:template>
<!-- default header-view places element name in <h2> tag -->
<xsl:template match="*" mode="header-view">
<h2><xsl:value-of select="name()"/></h2>
</xsl:template>
<!-- default header-view when no text content is no-op -->
<xsl:template match="*[not(text())]" mode="header-view"/>
<!-- default content-view is to apply-templates -->
<xsl:template match="*" mode="content-view">
<xsl:apply-templates/>
</xsl:template>
<!-- special content handling -->
<xsl:template match="special" mode="content-view">
<strong><xsl:apply-templates/></strong>
</xsl:template>
本体に入ると、 test要素に含まれるすべての要素にheader-content-widgetが適用されます (ドキュメントの順序で)。
デフォルトのheader-content-widgetテンプレート (「*」に一致) は、最初にheader-viewを適用し、次に現在の要素にcontent-viewを適用します。
デフォルトのヘッダー ビューテンプレートは、現在の要素の名前を h2 タグに配置します。デフォルトのcontent-viewは、一般的な処理規則を適用します。
[not(text())]述語によって判断されるコンテンツがない場合、要素の出力は発生しません。
1 回限りの特殊なケースも簡単に処理できます。