output methodこれは、 を に設定すると実現できますtext。
この変換:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="char">
<xsl:value-of select="concat('&#x', /char/@hex, ';', '')"/>
</xsl:template>
</xsl:stylesheet>
提供された XML ドキュメントに適用した場合:
<char hex="AB"/>
必要な結果を生成します:
«
もちろん、text出力メソッドでは、開始タグと終了タグの個々の文字を生成する必要があります ( <xsl:copy>、<xsl:copy-of>、<xsl:element>およびリテラルの結果要素は、この出力メソッドではタグを生成しません) が、ある程度の忍耐力があれば、すべて可能です。
DOE (出力エスケープの無効化) を使用することもできますが、この「機能」は XSLT 仕様では必須ではありません。また、一部の XSLT プロセッサ (FF で使用されているものも含む) は DOE を実装していません。
おそらく最良の解決策(を使用しないmethod="text")は次のとおりです。
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="my:my" exclude-result-prefixes="my"
>
<xsl:output omit-xml-declaration="yes" indent="yes" encoding="us-ascii"/>
<my:hex>
<code start="8">€‚ƒ„…†‡ˆ‰Š‹ŒŽ</code>
<code start="9">‘’“”•–—˜™š›œžŸ</code>
<code start="A"> ¡¢£¤¥¦§¨©ª«¬­®¯</code>
<code start="B">°±²³´µ¶·¸¹º»¼½¾¿</code>
<code start="C">ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏ</code>
<code start="D">ÐÑÒÓÔÕÖרÙÚÛÜÝÞß</code>
<code start="E">àáâãäåæçèéêëìíîï</code>
<code start="F">ðñòóôõö÷øùúûüýþÿ</code>
</my:hex>
<xsl:variable name="vHex" select="document('')/*/my:hex/*"/>
<xsl:template match="char">
<xsl:variable name="vchar1" select="substring(@hex,1,1)"/>
<xsl:variable name="vchar2" select="substring(@hex,2,1)"/>
<xsl:variable name="voffset">
<xsl:choose>
<xsl:when test="number($vchar2)">
<xsl:value-of select="$vchar2"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="count($vHex[@start = $vchar2]/preceding-sibling::*)+9"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:value-of select="substring($vHex[@start=$vchar1], $voffset, 1)"/>
</xsl:template>
</xsl:stylesheet>
この変換が提供された XML ドキュメントに適用されると、次のようになります。
<char hex="AB"/>
必要な結果が生成されます:
«
これは、hex属性の値が x80 から xFF の範囲の 16 進数であることを前提としています。x00 から XFF など、より広い範囲の値が必要な場合は、それに応じてさらに要素codeを追加する必要があります。my:hex