1

XML ドキュメントを動的に作成する必要があるという要件があります。この XML のノードの属性の一部には、上付き文字 Reg などが含まれています。私の質問は、そのような上付き文字を XML に格納し、XSL を使用して読み取って HTML としてレンダリングする方法です。サンプル XML を以下に示します。

<?xml version="1.0" encoding="utf-8"?>
<node name="Some text <sup>®</sup>"/>  

これは XML を壊すため、属性内の sup タグの下に格納できないことを知っています。&lt;sup&gt;開閉タグ代わりにも使ってみました。ただし、<sup>実際に上付き文字にするのではなく、HTML のようにレンダリングされます。この問題の解決策を教えてください。XML の生成を制御できます。上付き文字を格納する正しい方法を知っていれば、正しい方法で書くことができます。

4

3 に答える 3

2

XSL を使用して入力を HTML に変換しているため、別の方法を使用して、上付き文字にする必要があるという事実をエンコードすることをお勧めします。たとえば、独自の簡単なマークアップを作成します。

<node name="Some text [[®]]"/>

マークアップは、後で一意に識別でき、データ内で自然に発生しないものであれば何でもかまいません。<sup>次に、XSL プロセスで、特別なマークアップをおよびに変換するカスタム テンプレートを使用して、このマークアップを含めることができる属性値を処理します</sup>。これにより、ドキュメント構造を維持しながら (つまり、これらの文字列値をテキスト ノードに移動しないで)、目標を達成することができます。

于 2013-01-03T06:01:26.583 に答える
1

この問題の解決策を教えてください。XML の生成を制御できます。上付き文字を格納する正しい方法を知っていれば、正しい方法で書くことができます。

属性には値のみ (ノードなし) を含めることができるため、解決策は、要素内にマークアップ (ノード) を格納することです

<node>
 <name>Some text <sup>®</sup></name>
</node>
于 2013-01-03T04:35:33.663 に答える
0

上付き文字にする必要があるのが ® のような 1 文字だけの場合は、悪意のあるものを使わずに XML を残すことができ<sup>ます

<node name="Some text ®"/>  

処理中に上付き文字を探します。次のようなテンプレートが役立ちます。

<xsl:template match="node/@name">
  <xsl:param name="nameString" select="string()"/>
  <!-- We're stepping through the string character by character -->
  <xsl:variable name="firstChar" select="substring($nameString,1,1)"/>

  <xsl:choose>
    <!-- '®' can be extended to be a longer string of single characters
         that are meant to be turned into superscript -->
    <xsl:when test="contains('®',$firstChar)">
      <sup><xsl:value-of select="$firstChar"/></sup>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="$firstChar"/>
    </xsl:otherwise>
  </xsl:choose>

  <!-- If we we didn't yet step through the whole string,
       chop off the first character and recurse. -->
  <xsl:if test="$firstChar!=''">
    <xsl:apply-templates select=".">
      <xsl:with-param name="nameString" select="substring($nameString,2)"/>
    </xsl:apply-templates>
  </xsl:if>
</xsl:template>

ただし、このアプローチはあまり効率的ではありません。特に、多数のname属性や非常に長いname属性がある場合はなおさらです。アプリケーションのパフォーマンスが重要な場合は、処理時間への影響が正当かどうかをテストすることをお勧めします。

于 2013-01-03T07:09:54.080 に答える