2011-12-08 100 views
0

我真的很新的XSLT,所以我會很感激,如果有人能幫助我......我 有這樣一個XML XML元素屬性和XML標記HTML表:如何創建使用XSLT

 <dummy> 
     <element name="O"> 
      <description/> 
     </element> 
     <element name="L"> 
      <description>abstract for L</description> 
     </element> 
     <element name="Sd"> 
      <description>Description for Sd</description> 
     </element> 
     <element name="Dh"> 
      <description/> 
     </element> 
     <element name="P"> 
      <description/> 
     </element> 
     <element name="S"> 
      <description>Some description for S</description> 
     </element> 
     <element name="A"> 
      <description/> 
     </element> 
     <L>2010</L> 
     <A>58.78</A> 
     <O>O</O> 
     <Sd>1101</Sd> 
     <S>0.00</S> 
     <A>368.38</A> 
     <L>2009</L> 
     <Sd>1103</Sd> 
    </dummy> 

我已經到了這樣一個最終的HTML表(使用XSLT「1.0」):

  <tr> 
    <td> 
     I have to select only non element tags one by one, and then replace the tag with the 
     description of the same element name (in case that decription does not exists then display only element name). 
    </td> 
    <td> 
     Value of non element tag 
    </td> 
    </tr> 


4 example (upper xml) 
    [in something like for-each]: take <L> 2010 </L> 

然後搜索元素名稱=「L」(如果描述存在=真拿 說明其他「L」 )和 顯示摘要爲L 2010

因此,最終輸出4給定的XML應該是:

<tr><td> abstract for L </td> <td> 2010 </td> </tr> 
    <tr><td> A </td> <td> 58.78 </td> </tr> 
    <tr><td> O </td> <td> O </td> </tr> 
    <tr><td> Description for Sd </td> <td> 1101 </td> </tr> 
    <tr><td> Some description for S </td> <td> 0.00 </td> </tr> 
    <tr><td> A </td> <td> 368.38 </td> </tr> 
    <tr><td> abstract for L </td> <td> 2009</td> </tr> 
    <tr><td> Description for Sd </td> <td> 1103 </td> </tr> 

對XSLT必須寫在XSLT =「1.0」

回答

0

我想你可以利用的關鍵這裏,看你元素沒有DES由屬性

<xsl:key name="elements" match="element" use="@name" /> 

首先,你需要匹配所有的非元素節點,像這樣

<xsl:apply-templates select="dummy/*[not(self::element)]" /> 

然後查找匹配的描述元素您可以使用之前設置的密鑰

<xsl:apply-templates select="key('elements', local-name())"/> 

在這種情況下,對於元素節點,您將有兩個匹配的模板;一個用於元素節點與描述,和一個沒有。

以下是完整的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" indent="yes"/> 
    <xsl:key name="elements" match="element" use="@name"/> 

    <xsl:template match="/"> 
     <table> 
     <xsl:apply-templates select="dummy/*[not(self::element)]"/> 
     </table> 
    </xsl:template> 

    <xsl:template match="*[not(self::element)]"> 
     <tr> 
     <td> 
      <xsl:apply-templates select="key('elements', local-name())"/> 
     </td> 
     <td> 
      <xsl:value-of select="."/> 
     </td> 
     </tr> 
    </xsl:template> 

    <xsl:template match="element"> 
     <xsl:value-of select="@name"/> 
    </xsl:template> 

    <xsl:template match="element[description[node()]]"> 
     <xsl:value-of select="description"/> 
    </xsl:template> 
</xsl:stylesheet> 

當適用於您的示例XML,以下HTML輸出:

<table> 
    <tr> 
     <td>abstract for L</td> 
     <td>2010</td> 
    </tr> 
    <tr> 
     <td>A</td> 
     <td>58.78</td> 
    </tr> 
    <tr> 
     <td>O</td> 
     <td>O</td> 
    </tr> 
    <tr> 
     <td>Description for Sd</td> 
     <td>1101</td> 
    </tr> 
    <tr> 
     <td>Some description for S</td> 
     <td>0.00</td> 
    </tr> 
    <tr> 
     <td>A</td> 
     <td>368.38</td> 
    </tr> 
    <tr> 
     <td>abstract for L</td> 
     <td>2009</td> 
    </tr> 
    <tr> 
     <td>Description for Sd</td> 
     <td>1103</td> 
    </tr> 
</table> 
+0

蒂姆c您排除:) – tequila

+0

完美的作品.... – tequila

0

它包括選擇在謂詞使用name()了「字母」命名的元素:

<xsl:template match="element"> 
    <xsl:param name='name' select="@name" /> 
    <td><xsl:value-of select="description" /></td> 
    <td><xsl:value-of select="//*[name() = $name]" /></td> 
</xsl:template> 
+0

感謝名單安德魯Shooner 4您的重播,但結果是不正確的。我uppgraded您的代碼與\t \t \t \t \t \t \t \t \t \t \t \t \t \t的 \t \t \t \t \t \t \t \t \t的 \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t的 \t \t \t \t \t \t \t \t \t的 \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t tequila

+0

但給定的結果(我正在使用xmlspy): – tequila

+0

​​O ​​O ​​抽象對於L ​​2010 ​​說明對於SD ​​1101 ​​迪拉姆 ​​ ​​P ​​ ​​一些描述對於s ​​0.00 ​​A ​​58.78。我需要將所有節點標記一個接一個地複製,像這樣 – tequila