2012-05-02 11 views
1

を使用してindependtly HTMLタグを閉じて、私は次の変数を使用しています挿入口とXSLT

<xsl:variable name="openTag"> 
<![CDATA[ 
<div> 
]]> 
</xsl:variable> 

<xsl:variable name="closeTag"> 
<![CDATA[ 
</div> 
]]> 
</xsl:variable> 

そして、次のように実装:

<div class="root"> 
     <xsl:variable name="ownerid" select="Prp[@name='owner id']/@value" /> 
     <xsl:variable name="nextownerid" select="preceding-sibling::Node[1]/Prp[@name='owner id']/@value"/> 

     <xsl:choose> 
     <xsl:when test="$ownerid = '-1'"> 
      <xsl:copy-of select="$LogText"/> 
     </xsl:when> 
     <xsl:when test="$ownerid &lt; $nextownerid"> 
      <xsl:copy-of select="$openTag"/> 
      <xsl:copy-of select="$LogText"/> 
     </xsl:when> 

     <xsl:when test="$ownerid &gt; $nextownerid"> 
      <xsl:copy-of select="$openTag"/> 
      <xsl:copy-of select="$LogText"/> 
      <xsl:copy-of select="$closeTag"/> 
      <xsl:copy-of select="$closeTag"/> 
     </xsl:when> 

     <xsl:otherwise> 
      <xsl:copy-of select="$openTag"/> 
      <xsl:copy-of select="$LogText"/> 
      <xsl:copy-of select="$closeTag"/> 
     </xsl:otherwise> 
     </xsl:choose> 
    </div> 

問題がdivタグは以下のように出力されていることですHTMLタグとして認識されません。回避策はありますか?

+2

代わりにテンプレートを別のテンプレートにしたことがありますか? –

+2

@ sanjay_c0d3rこれは決して必要ありません。オープンタグとクローズタグをXSLTを介して個別に出力しようとしている場合は、間違っていることが間違いありません。達成しようとしていることを説明できますか? – Tomalak

+0

私はxsltを初めて使用しています。私は再送を試みましたが、それはあまりにも多くの合併症を引き起こしました。私はxsltを使用してhtmlで木のような構造を実装する必要があります。私は所有者id(xmlの属性として存在する)に基づいて必要なインデントを与えるためにCSSを実装しています。 root ownerid = -1の場合、最初の子は0、次は1となり、同じ親に属していれば同じままです。 –

答えて

1

これは、あなたがが実際にを探しているXSLT 1.0変換です。

これは、任意のdisable-output-escaping策略なし整形式HTMLの素敵なネストされたツリーを作成します。

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

    <!-- index Nodes by their owner ID --> 
    <xsl:key name="kNodeByOwnerId" match="Node" use="Prp[@name = 'owner id']/@value" /> 

    <xsl:template match="/"> 
    <html> 
     <head> 
     <style type="text/css"><![CDATA[ 
      body { 
      font-size: 14px; 
      font-family: verdana; 
      background-color: white; 
      } 
      div.root { 
      padding: 0px 0px 2px 0px; 
      } 
      div.root div { 
      padding: 0px 0px 0px 0px; 
      margin-left: 3em; 
      } 
      div.remark { 
      margin-left: 2em; 
      } 
      img.icon { 
      padding-right: 5px; 
      } 
      span.log { 
      font-weight: bold; 
      } 
      span.log.fail { 
      color: red; 
      } 
      span.log.pass { 
      color: green; 
      } 
      span.log.info { 
      color: blue; 
      } 
     ]]></style> 
     </head> 
     <body> 
     <!-- output "top level" nodes, i.e. those with owner ID -1 --> 
     <xsl:apply-templates select="key('kNodeByOwnerId', '-1')"> 
      <xsl:sort select="substring-after(@name, 'message ')" data-type="number" /> 
      <xsl:with-param name="containerClass" select="'root'" /> 
     </xsl:apply-templates> 
     </body> 
    </html> 
    </xsl:template> 

    <xsl:template match="Node"> 
    <xsl:param name="containerClass" select="''" /> 

    <xsl:variable name="messageClass"> 
     <xsl:apply-templates select="Prp[@name = 'type']" /> 
    </xsl:variable> 

    <div class="{$containerClass}"> 
     <img class="icon" src="./{$messageClass}.png" /> 

     <span class="log {$messageClass}"> 
     <xsl:value-of select="Prp[@name='message']/@value"/> 
     </span> 

     <xsl:apply-templates select="Prp[@name = 'remarks']" /> 

     <!-- output nodes that belong to this node (recursive!) --> 
     <xsl:apply-templates select="key('kNodeByOwnerId', Prp[@name = 'id']/@value)"> 
     <xsl:sort select="substring-after(@name, 'message ')" data-type="number" /> 
     </xsl:apply-templates> 
    </div> 
    </xsl:template> 

    <xsl:template match="Prp[@name = 'remarks']"> 
    <xsl:if test="normalize-space(@value) != ''"> 
     <div class="remark">    
     <img class="icon" src="./info.png" /> 
     <xsl:value-of select="@value"/>    
     </div> 
    </xsl:if> 
    </xsl:template> 

    <xsl:template match="Prp[@name = 'type']"> 
    <xsl:choose> 
     <xsl:when test="@value = '0'">pass</xsl:when> 
     <xsl:when test="@value = '4'">info</xsl:when> 
     <xsl:otherwise>fail</xsl:otherwise> 
    </xsl:choose> 
    </xsl:template> 

</xsl:stylesheet> 

<xsl:key>の使用に注意してください。キーがどのように機能するかの完全な説明はin an earlier answer of mineです。

コードは単純明快なので、それが何をしているのか理解するのは少し難しいはずです。何かが不明な場合は、お気軽にお尋ねください。

CSSコードを別のファイルに入れることを強くおすすめします。

+0

出力をツリーの形で表示するには、javascriptコードに従ってhtmlパーツを出力する必要があります。私は次のコードを書いています:http://pastebin.com/fyZG8a7N子供を持つノードだけに画像リンクを展開したり折りたたんだりする必要があります。私はそれを把握することができません。 –

+0

@sanjayすみません。これはまったく異なる質問の材料です。私たちはこのスレッドでXSLTを話しています。実際に私の解決策を理解するのに時間がかかったかどうかについてのコメントはすばらしいことでした。 – Tomalak

+0

はい、このコードのおかげでたくさん!あなたのコードを正しい答えとしてチェックしました。私は自分自身で残りを考え出した! :) –

8

XSLTは、ノードのツリーを入力として受け取り、出力としてノードのツリーを生成します。開始タグと終了タグを含む字句XMLは読み込まれず、開始タグと終了タグを含む語彙XMLは出力されません。入力ツリーは、XMLパーザと呼ばれる別のプロセッサによって字句XMLから構築され(通常は)、XMLシリアライザと呼ばれる別のプロセッサによって出力ツリーが字句XMLに変換されます。 XSLTプロセッサはシリアライザにアウト・オブ・バンド情報を送信することにより

無効出力エスケープがハックです。そのため、変圧器とシリアライザの間の望ましくない密結合が発生し、シリアライザが存在しないパイプライン(たとえば、Firefox)でXSLTコードが動作しなくなります。

あなたのロジックは、「グループ-隣接」の問題に取り組むためにしようとしているかのように見えます:グループ隣接するすべての要素が同じ所有者のIDを有します。シリアライゼーションのハックを使わずにXSLTのこの問題に取り組むより良い方法があります。 「兄弟再帰」の例を探して:XSLT 2.0で:あなたはXSLT 1.0に拘束ますが、難しいことではありませんしている場合

<xsl:for-each-group select="*" group-adjacent="owner-id"> 
    <div> 
    <xsl:copy-of select="current-group()"/> 
    </div> 
</xsl:for-each-group> 

は、それは少しトリッキーです。

関連する問題