あなたの理解は正しくないと思います。XSLT のテンプレートを順番に見ていくと、標準の ID テンプレートから始めます。
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
これは単に要素とその属性をコピーし、その子要素の処理を続行します。したがって、 HTML にh1タグがある場合は、そのまま出力されます。
次に、要素のテンプレートでフォローアップします。
<xsl:template match="a"><xsl:apply-templates/></xsl:template>
これは ID テンプレートよりも具体的であるため、優先されます。あなたの場合、それはa要素をコピーしませんが、その子を処理します。a要素にテキストが含まれていると仮定すると、これは必要に応じて出力されます。
最終的なテンプレートはimg要素と一致します
<xsl:template match="img"/>
しかし、これはすべて、それを完全に無視しているだけです。
XSLT には組み込みのテンプレートがあり、一致するものが見つからない場合に使用されることに注意してください。これらは要素をコピーしませんが、その子を処理し続けます。したがって、すべての HTML 要素をコピーしたくない場合は、組み込みのテンプレートを利用して、特定のアクションを実行したい要素のテンプレートのみを追加することができます。
私はあなたの要件を100%確信しているわけではありませんが、XHTMLを取り、要素内のテキストのみを出力したいだけなら、このXSLTを使用できます
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="a/text()">
<xsl:value-of select="." />
</xsl:template>
<xsl:template match="text()" />
</xsl:stylesheet>
そのため、 a<xsl:template match="a/text()">
要素内のテキストを出力しますが、特定性の低いものは他のすべてのテキストを無視します。組み込みのテンプレートは他の要素に使用され、前述のように、これはそれらを出力せず、その子を処理するだけです (したがって、最終的にはテキスト ノードに到達します)。<xsl:template match="text()">
たとえば、この HTML があるとします。
<html>
<head>
<title>Test</title>
</head>
<body>
<h1>Test</h1>
Welcome!
<img src="test.jpg" alt="Test Image" />
<p><a href="test.html">Test Link</a></p>
</body>
</html>
出力されるのはすべて
Test Link