2016-09-25 21 views
1

内の文字列の既存のシーケンスに文字を挿入する私はこのような構造を持っている:私は各故障の下ですべての信号の値を集めるので、title属性に入れたいXSLT 2.0

<faults> 
    <fault componentName="comp1"> 
    <introduceWhen>Time1</introduceWhen> 
    <signals> 
     <signal name="sig11" value="1"/> 
     <signal name="sig22" value="1"/> 
    </signals> 
    </fault> 
    <fault componentName="comp2"> 
    <introduceWhen>Time2</introduceWhen> 
    <signals> 
     <signal name="sig44" value="0"/> 
    </signals> 
    </fault> 
</faults> 

をその特定の表のセルにカーソルを置くと、障害に関する詳細情報を表示できます。この使用

<td title="comp1 sig11 1 sig22 1 comp2 sig44 0">comp1 1 1 Time1 comp2 0 Time2</td> 

::私は、文字列のシーケンスに必要な情報なので、などを取得するために管理している

<xsl:template match="faults"> 
    <xsl:attribute name="title"> 
    <xsl:value-of select="fault/@componentName | 
          fault/signals/signal/@name | 
          fault/signals/signal/@value"/> 
    </xsl:attribute> 
    <xsl:value-of select="fault/introduceWhen | fault/@componentName | 
         fault/signals/signal/@value"/> 
</xsl:template> 

しかし、私が持っているしたいことはあるが、この(&#xA;が改行されています) :

<td title="comp1&#xA;sig11: 1&#xA;sig22: 1&#xA;comp2&#xA;sig44: 0">comp1 1 1 Time1 comp2 0 Time2</td> 

私はreplace($faultDetails, ' (\d) ', ': $1&#xA;')を使用してみましたが、$faultDetailsが実際のに対し置き換えるだけ連続した文字列で動作し、スペースを含まない一連の文字列であることが分かりました。私はこれを書いているので、私はこれでほぼそこに行くことができることを実感します。

<xsl:value-of select="fault/@componentName | fault/signals/signal/@name | 
         fault/signals/signal/@value" separator="&#xA;"/> 

どのようにすればいいですか?

答えて

2

あなたが使用することができます私のため<td title="comp1&#xA;sig11: 1&#xA;sig22: 1&#xA;comp2&#xA;sig44: 0"/>を作成

<xsl:template match="faults"> 
    <td> 
     <xsl:attribute name="title" select="fault/(@componentName/string(), signals/signal/concat(@name, ': ', @value))" separator="&#xA;"/> 
    </td> 
</xsl:template> 

サクソン9.6と。

+0

ああ、あなたがその方法でコンマを使うことができるかどうかわからなかった、非常に素晴らしい解決策! – Fylke

+0

ああ待って、それはすべての作品を作る文字列にそれらを作る、ないのですか? – Fylke

+0

同じセパレータを持つ一連のノードが必要な場合は、たとえば、 ''しかし、信号名と値をコロンで区切りたい場合は、たとえば、 'signals/signal/concat(@name、 ':'、@ value)'シーケンス内の他の項目は明示的に文字列に変換する必要があります。私は間違った場所でそれをやってしまったので、コードスニペットを編集します。 –

1

あなたはちょうどあなたが望むものを明示的に列挙することがあります:あなたは、単一の式は、属性値を作成したい場合は

<xsl:template match="/faults"> 
    <td> 
     <xsl:attribute name="title"> 
      <xsl:for-each select="fault"> 
       <xsl:value-of select="@componentName"/> 
       <xsl:text>&#10;</xsl:text> 
       <xsl:for-each select="signals/signal"> 
        <xsl:value-of select="@name, @value" separator=": "/> 
        <xsl:if test="position()!=last()"> 
         <xsl:text>&#10;</xsl:text> 
        </xsl:if> 
       </xsl:for-each> 
       <xsl:if test="position()!=last()"> 
        <xsl:text>&#10;</xsl:text> 
       </xsl:if> 
      </xsl:for-each> 
     </xsl:attribute> 
     <!-- ??? --> 
    </td> 
</xsl:template> 
+0

これは、私が実際に使っているFirefox 38.2がより簡単なバージョンを処理できなかったので、私が実際に使った解決策でした。ありがとう! – Fylke

+0

@Fylke XSLT 2.0として質問をタグ付けしましたが、XSLT 2.0をサポートするブラウザはありません。この解決策は、XSLT 1.0でも動作しません。 'xsl:value-of'命令は、選択されたノードセットの最初のノードの値だけを返します。 –

+0

_No_ブラウザはXSLT 2.0をサポートしていませんか?うわー、それは知って良いです。しかし、この解決策はうまくいくので、あなたは他の答えに言及していると思いますか?私はXSLT 1.0としてファイルのラベルを付け直すかもしれないと思います。 – Fylke

関連する問題