2011-12-08 198 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