別のテンプレートの特定の要素に適用される特定のステートメントを分離しました。
要素は、 statement を含む 1 つのテンプレートで処理されます<xsl:apply-templates/>
。
最初のテンプレートで処理されたばかりの要素を、2 番目の (名前のない) テンプレートで再処理する方法はありますか?
もちろん、名前付きテンプレートを使用して最初のテンプレートから呼び出すことができることは知っていますが、このようにできるかどうかは疑問です。作業するものを提供するために、私が取り組んでいるものの非常に単純化されたモデルを次に示します。
テーブルを含む html 入力ファイルがあります。
<?xml version="1.0" encoding="UTF-8"?>
<table>
<tbody>
<tr>
<td>content</td>
<td></td>
<td/>
</tr>
</tbody>
</table>
block
各要素内に、文字列コンテンツがある場合はtd
それを囲む要素、または要素自体が空の場合は空である要素が必要です。私は次のことを試しました (最初のテンプレートに大きな変更を加えたくないことに注意してください!):td
td
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="*">
<xsl:copy>
<xsl:attribute name="test"><xsl:value-of select="local-name()"/></xsl:attribute>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="td/text()">
<block><xsl:value-of select="."/></block>
</xsl:template>
</xsl:stylesheet>
追加された属性は、最初のテンプレートで行われていることのモデル化された例にすぎません。
出力として与える
<?xml version="1.0" encoding="UTF-8"?>
<table test="table">
<tbody test="tbody">
<tr test="tr">
<td test="td">
<block>content</block>
</td>
<td test="td"/>
<td test="td"/>
</tr>
</tbody>
</table>
そして私は手に入れたい
<?xml version="1.0" encoding="UTF-8"?>
<table test="table">
<tbody test="tbody">
<tr test="tr">
<td test="td">
<block>content</block>
</td>
<td test="td">
<block/>
</td>
<td test="td">
<block/>
</td>
</tr>
</tbody>
</table>
機能しなかった理由は明らかです。空のtd
要素にはテキスト ノードがないため、これらは 2 番目のテンプレートの Xpath 式と一致しません。そこで、2 番目のテンプレートで要素自体
を再処理する方法を考え始めました。td
もちろん、match="td[some condition]"
最初のテンプレートが適用されないため、使用できません。
また、テンプレートの一致属性で軸が許可されていないmatch= "self::td"
ためself
(もちろん条件を除いて)、使用できません。または、一致を開始するときにまだ持っていない現在のノードが必要です。
2 番目のテンプレートで使用できる適切な Xpath 式はありますか?
または、1 つのテンプレートで処理されたばかりの要素に対して別の (名前のない) テンプレートをトリガーする別の簡単な方法はありますか?
注: 属性を追加する 2 番目のテンプレートの単純な更新を探しているわけではありません。最初のテンプレートで属性を追加し、2 番目のテンプレートでブロック要素を追加したいと考えています。