1

情報を含むすべてのノードがCDATAにあるXMLファイルがあります。これらの情報は、次のようなHTMLタグでフォーマットされている可能性があります。

<EventList>
    <Text><![CDATA[<p>Some text <i>is</i> formatted! This is a character entity &#39;</p>]]></Text>
    <ShortText><![CDATA[Some other is only plain]]></ShortText>
    <!-- others more -->
</EventList>

これを(X)HTMLページのXSLTで変換したい:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
<xsl:output 
  method="html" 
  doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
  media-type="application/xhtml+xml" 
  encoding="utf-8" 
  omit-xml-declaration="yes" 
  indent="no"
/>
  <xsl:template match="Text">
    <h2><xsl:copy-of select="text()"/></h2>
  </xsl:template>

  <xsl:template match="ShortText">
    <div><xsl:copy-of select="."/></div>
  </xsl:template>
</xsl:stylesheet>

しかし、この変換を適用すると、奇妙な動作が発生します。XSLTに配置したHTMLタグは、ブラウザーから正しく解析および解釈されますが、CDATA内のタグから<>および&charが削除され、次の出力が生成されます。

<h2>pSome text iis/i formatted!  This is a character entity #39;/p</h2>
<div>Some other is only plain</div>

最初は定義の問題のように見えました<xsl:output>が、私はまだこれに固執しています。.省略形のXPathと関数を使用しようとしましtext()たが、出力は同じです。どんな提案でも大歓迎です!

4

1 に答える 1

2

XMLによると、Text要素のコンテンツはマークアップのない文字列であり、左山かっこやアンパサンドなどのXML区切り文字が多数含まれています。あなたのスタイルシートは、その文字列をマークアップなしで文字列として書き出すように言っているので、準拠するHTMLプロセッサはそうし、出力として次のようなものを生成します。

<H2 xmlns="http://www.w3.org/1999/xhtml"
  >&lt;p&gt;Some text &lt;i&gt;is&lt;/i&gt; formatted! 
  This is a character entity &amp;#39;&lt;/p&gt;</h2>
<div xmlns="http://www.w3.org/1999/xhtml"
  ><ShortText xmlns="">Some other is only plain</ShortText></div>

行を短くするために改行を導入しました。これは、出力として表示しているものではなく、それ自体が示唆的です。

より良い結果を得る最も簡単な方法は、XMLにデータについての真実を伝え始めることです。Text要素にpやiなどのHTML要素を含める場合は、そうしてから、その上でID変換を使用します。データの一部。

このXMLの壊れたデザインが行き詰まっている場合はdisable-output-escaping、xsl:value-of要素の属性を使用して損傷を回避できます。(警告:disable-output-escapingを使用する必要があることは、ほとんどの場合、デザインに問題があることを示しています。)このバージョンのテキスト用テンプレートは、入力の文字列データがXHTMLマークアップとして書き出される出力を生成します。

<xsl:template match="Text">
  <h2><xsl:value-of select="string(.)" 
                    disable-output-escaping="yes"/></h2>
</xsl:template>
于 2012-10-11T16:17:21.803 に答える