web-dev-qa-db-ja.com

任意のタイプのテンプレートコンテキスト要素のすべての子ノードをコピーする方法

XSLTを使用してXMLをHTMLに変換しています。

次のXML構造があります。

<root>
    <element>
        <subelement>
            This is some html text which should be <span class="highlight">displayed highlighted</span>.
         </subelement>
    </element>
</root>

次のテンプレートを変換に使用します。

<xsl:template name="subelement">
  <xsl:value-of select="." />
</xsl:template>

残念ながら、私は<span>-タグ。

HTMLが正しく表示(強調表示)されるようにそれらを保持する方法はありますか?

14
monty

現在一致しているノード(含まれているテキストノード)のすべてのコンテンツを取得する正しい方法は次のとおりです。

    <xsl:template match="subelement">
       <xsl:copy-of select="node()"/>
    </xsl:template>

これにより、すべての子孫がコピーされます。

33
Emiliano Poggi

たとえば、<xsl:copy-of...の代わりに<xsl:value-of...を使用してみてください。

<xsl:template name="subelement">
  <xsl:copy-of select="*" />
</xsl:template>

*ビットを含む<subelement></subelement>を使用するのではなく、.ビットを結果に出力しないようにする<subelement></subelement>に注意してください。

たとえば、xslスタイルシート:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

    <xsl:template match="root/element">
        <output>
            <xsl:apply-templates select="subelement"/>
        </output>
    </xsl:template>

    <xsl:template match="subelement">
        <xsl:copy-of select="*"/>
    </xsl:template>

</xsl:stylesheet>

サンプルxmlファイルに適用すると、次が返されます。

<?xml version="1.0" encoding="UTF-8"?>
<output>
    <span class="highlight">displayed highlighted</span>
</output>
7
Jon Egerton

<xsl:value-of>宣言は、要素内のすべてのテキストノードの連結されたコンテンツを順番に取得し、要素をまったく出力しません。

代わりに<xsl:apply-templates>を使用することをお勧めします。テキストノードが見つかると、コンテンツがそのまま出力されますが、スパンタグを処理してHTMLタグに変換するためのテンプレートを定義する必要があります。そのスパンタグIS htmlタグの場合、厳密に言えば、独自のドキュメント構造とhtmlに個別の名前空間が必要です。

0
Flynn1179