まず、属性はアポストロフィまたは引用符で囲む必要があるため、XMLは整形式ではありませんが、これは単純なタイプミスである可能性があります。
特定の問題は処理命令であるため、text()をチェックするxsl:ifはこれを取得しません。
<xsl:value-of select="link" />
また、現在のコンテキストがすでにリンク要素上にあるために問題が発生しているため、これは現在のリンク要素の子である別のリンク要素を探しています。あなたはおそらくこのようなことをしたいだけです
<xsl:value-of select="." />
だから、あなたはそのようにあなたのテンプレートを書き直すことができます
<xsl:template match="link">
<xsl:element name="{local-name(.)}">
<xsl:attribute name="sshref">
<xsl:value-of select="@ref"/>
</xsl:attribute>
<xsl:if test="text()|processing-instruction()">
<xsl:element name="num">
<xsl:apply-templates select="text()|processing-instruction()"/>
</xsl:element>
</xsl:if>
</xsl:element>
</xsl:template>
<xsl:template match="processing-instruction()">
<xsl:value-of select="."/>
</xsl:template>
ただし、多くの場合、 xsl:if要素の使用を避け、代わりにテンプレートマッチングの機能を使用する方がよいことに注意してください。代わりに、この代替XSLTを試してください。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="link[text()|processing-instruction()]">
<link>
<num>
<xsl:apply-templates select="text()|processing-instruction()"/>
</num>
</link>
</xsl:template>
<xsl:template match="link/@ref">
<xsl:attribute name="ssref">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
<xsl:template match="processing-instruction()">
<xsl:value-of select="."/>
</xsl:template>
<xsl:template match="@*|node()[not(self::processing-instruction())]">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
次のXMKに適用した場合
<comp>
<link ref="1">1997</link>
<link ref="2"><?LINK 2008?></link>
</comp>
以下が出力されます。
<comp>
<link sshref="1">
<num>1997</num>
</link>
<link sshref="2">
<num>2008</num>
</link>
</comp>
動的に名前が付けられた要素が必要でない限り、xsl:elementを使用する必要はないことに注意してください。