0

次のような形式で XML を返すコードがあります。

ソース XML:

<Root>
    <Book>
        <BookId>a</BookId>
        &lt;Description&gt;aDescription&lt;/Description&gt;
    </Book>
    <Book>
        <BookId>b</BookId>
        &lt;Description&gt;bDescription&lt;/Description&gt;
    </Book>
</Root>

特殊文字をリテラル文字に置き換えたい...

&lt; 

< などになります。

私は使用できることを知っています:

<xsl:character-map name="escapeMapper">
    <xsl:output-character character="&lt;" string="&lt;"/>
    <xsl:output-character character="&gt;" string="&gt;"/>        
</xsl:character-map>  

ただし、ここにひねりがあります。最初に特殊文字を変換してから、結果の XML を他のテンプレートで実行したいと考えています。したがって、特殊文字を置き換えるテンプレートを使用してソース XML を実行し、結果を変数に入れたいと考えています。

<xsl:variable name="vrtfPass1">

これで、マルチパス手法を使用して、変数をソースとして使用して他のテンプレートを適用できます。

特殊文字をリテラル文字に変換するにはどうすればよいですか?

4

1 に答える 1

0

あなたがしたいことは&lt;and&gt;<andに変換することではなく、XML>解析することのようですね。あなたがやっていることでSaxon拡張関数を使うことができますか? もしそうなら、私はあなたが次のようなことをすることができると思います:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                              xmlns:saxon="http://saxon.sf.net/">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
    <xsl:variable name="loaded">
      <xsl:apply-templates />
    </xsl:variable>

    <xsl:apply-templates select="$loaded/*" />
  </xsl:template>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="Book/text()[normalize-space()]">
    <xsl:copy-of select="saxon:parse(.)"/>
  </xsl:template>
</xsl:stylesheet>

ただし、これは、 のテキストの子Bookが常に整形式の XML であると想定しています。

于 2013-03-04T15:56:11.503 に答える