2011-11-15 9 views
1

私はXSLTとXPathにはかなり新しく、この問題でしばらくの間壁に頭を打っています。XSLが期待以上に出力されています

<reply> 
    <multi-results> 
     <multi-item> 
      <name>node1</name> 
      <information> 
       <block> 
        <slot>A</slot> 
        <state>Online</state> 
        <colour>purple</colour> 
       </block> 
       <block> 
        <slot>B</slot> 
        <state>Online</state> 
        <colour>yellow</colour> 
       </block> 
       <block> 
        <slot>C</slot> 
        <state>Online</state> 
        <colour>red</colour> 
       </block> 
       <block> 
        <slot>D</slot> 
        <state>Online</state> 
        <colour>blue</colour> 
       </block> 
      </information> 
     </multi-item> 
    </multi-results> 
    <address> 
     <label>this is an arbitrary bit of text included for this example</label> 
    </address> 
</reply> 

は、ファイルごとに「ブロック」のエントリの可変数があります。

は、私は、次のXMLを持っています。

私が "CSV" データたい、と私は、次のXSLを使用しています:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 
    <xsl:template match="*/text()[normalize-space()]"> 
     <xsl:value-of select="normalize-space()"/> 
    </xsl:template> 
    <xsl:template match="*/text()[not(normalize-space())]" /> 
    <xsl:template match="block"> 
     <xsl:value-of select="slot"/> 
     <xsl:text>|</xsl:text> 
     <xsl:value-of select="state"/> 
     <xsl:text>|</xsl:text> 
     <xsl:value-of select="colour"/> 
     <xsl:text>&#10;</xsl:text> 
    </xsl:template> 
</xsl:stylesheet> 

出力:

node1A|Online|purple 
B|Online|yellow 
C|Online|red 
D|Online|blue 
this is an arbitrary bit of text included for this example 

ただし、出力は "名前" との両方を含んでいます「ラベル」...

私は明示的にXSLにするために求めているものだけをしたい:

A|Online|purple 
B|Online|yellow 
C|Online|red 
D|Online|blue 

なぜか分かりません。誰か説明してもらえますか?

また、複数の「名前」要素があり、それぞれに独自の数の「ブロック」要素があります。テンプレート:あなたの最初のxslから価値の:事前

答えて

3

:空のボディを持つそれらのテンプレート:また、あなたは1つのXSLを残して、テキストノード上の条件をチェックする必要はありません。これを防ぐために、あなたはノードをテキストに、テンプレートを適用することはありませんので、あなたは、テキストノードに一致するテンプレートルールを必要としない

<xsl:template match="/"> 
    <xsl:apply-templates select="block"/> 
</xsl:template> 

を追加する必要があります。

+0

これははるかにクリーンなソリューションです。ちなみに、私はあなたの本でXSLTを学んだ、ありがとう! – bravit

+0

この提案に感謝します。私はあなたの助けに感謝します! – wawawawa

2

多くのおかげでちょうどXSLを削除します。それにより、「名前」と「ラベル」の内容が得られます。これは、任意のテキストノードを取り、内容を出力します。 <block>外の要素は、既定のテンプレートルールを使用して処理されている

<xsl:template match="*/text()"/> 
+0

ごめんなさい - どういう意味なのか分かりません... "最初の"テンプレートを言うとき、 '' ?? – wawawawa

+0

Aha!今分かります。私は ''を削除する必要があります。 – wawawawa

関連する問題