5

次のような XML ファイルがあるとします。

<library>
 <books>
  <![CDATA[<genre><name>Sci-fi</name><count>2</count></genre>]]>
  <book>
   <name>
    Some Book
   </name>
   <author>
    Some author
   </author>
  <book>
  <book>
   <name>
    Another Book
   </name>
   <author>
    Another author
   </author>
  <book>
 <books>
</library>

xslt トランスフォーマーで CDATA 要素 'name' を読み取り、その値をタグの値のどこかに配置したいと考えています。どうすればいいですか?私の知る限り、CDATA の内容に xpath を使用することはできません。これに対するハック/回避策はありますか? これを厳密に XSLT で行いたいと考えています。

4

4 に答える 4

7

一部の XSLT 製品には、saxon:parse() などの拡張関数があり、字句 XML を含む文字列を取得してノードのツリーに変換できます。

于 2012-04-26T08:24:05.120 に答える
6

CDATA セクションを選択して、結果を 2 番目の XSL に渡すこともできます。

たとえば、次のように CDATA セクションを取得した場合:

<xsl:template match="//books/text()">
  <xsl:value-of select="." disable-output-escaping="yes"/>
</xsl:template>

次のような結果になります。

<genre><name>Sci-fi</name><count>2</count></genre>

その後、別の XSL を適用するか、DOM のみを扱う場合は XPATH を適用できます。これは、CDATA が常に有効な XML であることを前提としています。それ以外の場合は、Martin による RegEx の回答がその方法です。

于 2012-04-25T21:32:27.127 に答える
3

CDATA ブロックはテキスト ノード (の一部) であるため、次のように、2 つの「タグ」の間のテキストを抽出できます。

<xsl:template match="text()">
  <xsl:value-of select="substring-before(substring-after(., '&lt;name>'), '&lt;/name>')"/>
</xsl:template>

これは簡単なアイデアです。CDATA 内に複数の名前「要素」がある場合は、上記の式を再帰的に複数回適用するだけです。

于 2012-04-25T20:51:54.243 に答える