0

XSLTを使用してXMLに定義リストを作成しようとしています。

これが私の入力がどのように見えるかの図です:

  <p>

    <i>word1</i> definition text here <br />
    <br />
       <i>word1</i> definition text here <br />
    <br />
       <i>word1</i> definition text here <br />
    <br />
       <i>word1</i> definition text here <br />
    <br />
       <i>word1</i> definition text here <br />

</p>

上記のXMLの「ここの定義テキスト」は、タグを付けて出力に含めるタグのないテキストノードです。私が欲しい出力のイラストは以下の通りです:

<dl>
   <di>
      <dt>word1</dt>
      <dd>definition text here<dd>
   <di>
<dl>

これまでのところ機能していない私のテンプレート:

<xsl:template match="p">

        <dl>
             <dt>
                <xsl:value-of select="./i/node()"/>
            </dt>

             <dd>
              <xsl:sequence select="./text()" />
            </dd>
        </dl>

    </xsl:template>

誰もがこれを行うための迅速かつ簡単な方法を知っていますか?

前もって感謝します。

4

2 に答える 2

1

この変換

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="p">
     <dl>
       <di><xsl:apply-templates/></di>
     </dl>
 </xsl:template>

 <xsl:template match="i">
  <dt><xsl:value-of select="."/></dt>
 </xsl:template>

 <xsl:template match="text()[preceding-sibling::*[1][self::i]]">
  <dd><xsl:value-of select="normalize-space()"/></dd>
 </xsl:template>
</xsl:stylesheet>

提供されたXMLドキュメントに適用された場合(ひどく不正な形式でした-ここで修正されました):

<p>
    <i>word1</i> definition text here 
    <br />
    <br />
    <i>word2</i> definition text here
    <br />
    <br />
    <i>word3</i> definition text here
    <br />
    <br />
    <i>word4</i> definition text here
    <br />
    <br />
    <i>word5</i> definition text here
    <br />
</p>

必要な正しい結果を生成します

<dl>
   <di>
      <dt>word1</dt>
      <dd>definition text here</dd>
      <dt>word2</dt>
      <dd>definition text here</dd>
      <dt>word3</dt>
      <dd>definition text here</dd>
      <dt>word4</dt>
      <dd>definition text here</dd>
      <dt>word5</dt>
      <dd>definition text here</dd>
   </di>
</dl>

ブラウザに次のように表示されます

word1
ここに定義テキスト
word2
ここに定義テキスト
word3
ここに定義テキスト
word4
ここに定義テキスト
word5
ここに定義テキスト
于 2012-09-15T02:28:27.337 に答える
1

入力の各要素に対して1つではなく、入力diの各要素に対して1つの要素を放出する必要があります。したがって、まず、コードをのテンプレートに移動します。ipi

入力では、それぞれiの直後に、としてタグ付けされるテキストを含む単一のテキストノードが続きますdd。これは要素内に埋め込まれている必要があるため、次のようなdiテンプレート内で処理する必要があります(テストされていません)。i

<xsl:template match='i'>
  <di>
    <dt><xsl:value-of select="."/></dt>
    <dd><xsl:value-of select="following-sibling::text()[1]"/></dd>
  </di>
</xsl:template>
<xsl:template match="p/text() | p/br"/>

一部の定義にマークアップが埋め込まれている場合は、dd要素を設定するためのより複雑な方法が必要になりますが、その日の悪は今日まで十分です。あなたは素早く簡単な何かを求めました。

于 2012-09-15T02:24:55.947 に答える