在XSLT中显示元素和相应的值

时间:2015-04-23 04:07:22

标签: xml xslt parent xslt-2.0

我是XSLT初学者,我的要求是以表格格式获取元素及其各自的值,我尝试了但是我没有得到期望,请为我的要求提出解决方案。

我的输入XML是

<group>
<elementgroup1>
<element1>value1</element1>
<element2/>
<element3>value3</element3>
</elementgroup1>
<elementgroup2>
<elementsubgroup2>
<element4>value4</element4>
<element5>value5</element5>
</elementsubgroup2>
</elementgroup2>
</group>

我的xslt是

 <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:template match="/">
<xsl:element name="table">
    <xsl:attribute name="border" select="'1'"/>
    <xsl:element name="tr">
        <xsl:element name="th">XML Viewer</xsl:element>
    </xsl:element>
    <xsl:for-each select="/group//*"> 
        <xsl:call-template name="mytemplate"/> 
    </xsl:for-each> 
</xsl:element>
</xsl:template>
<xsl:template name="mytemplate">
    <xsl:element name="tr">
        <xsl:element name="td">
            <xsl:value-of select="name()"></xsl:value-of>
        </xsl:element>
        <xsl:for-each select="child::*"> 
        <xsl:element name="td">
            <xsl:value-of select="."></xsl:value-of>
        </xsl:element>
        </xsl:for-each>
    </xsl:element>
/xsl:template>
</xsl:stylesheet>

我需要的输出

<table border="1">
<tr>
<th>
Output
</th>
</tr>
<tr>
<td>
group
</td>
<td/>
</tr>
<tr>
<td>
elementgroup1
</td>
<td/>
</tr>
<tr>
<td>
element1
</td>
<td>
value1
</td>
</tr>
<tr>
<td>
element2
</td>
<td/>
</tr>
<td>
element3
</td>
<td>
value3
</td>
</tr>
</table>

显示输出 输出应采用表格格式,请参见下文

Output
group   
elementgroup1   
element1    value1
element2    
element3    value3
.
.
.
go on till end

2 个答案:

答案 0 :(得分:1)

当我理解正确时,你需要像这样的转换

<?xml version="1.0" encoding="UTF-8" ?>
    <xsl:stylesheet version="1.0"        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" version="4.0" indent="yes"/>

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

    <xsl:template match="*">
        <tr>
           <td><xsl:value-of select="name()"/></td>            
           <td><xsl:value-of select="normalize-space(text())"/></td>
        </tr>
        <xsl:apply-templates select="*"/>
    </xsl:template>
 </xsl:stylesheet>

生成示例XML的以下输出

<table>
   <tr>
      <td>group</td>
      <td></td>
   </tr>
   <tr>
      <td>elementgroup1</td>
      <td></td>
   </tr>
   <tr>
      <td>element1</td>
      <td>value1</td>
   </tr>
   <tr>
      <td>element2</td>
      <td></td>
   </tr>
   <tr>
      <td>element3</td>
      <td>value3</td>
   </tr>
   <tr>
      <td>elementgroup2</td>
      <td></td>
   </tr>
   <tr>
      <td>elementsubgroup2</td>
      <td></td>
   </tr>
   <tr>
      <td>element4</td>
      <td>value4</td>
   </tr>
   <tr>
      <td>element5</td>
      <td>value5</td>
   </tr>
</table>

= edit =

使元素变粗,不包含文本(需要CSS span-class font-bold):

<?xml version="1.0" encoding="UTF-8" ?>
    <xsl:stylesheet version="1.0"        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" version="4.0" indent="yes"/>

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

    <xsl:template match="*">
        <xsl:variable name="bold">
            <xsl:value-of select="'font'"/>
            <xsl:if test="not(string-length(normalize-space(text())))">
                <xsl:value-of select="'-bold'"/>
            </xsl:if>
        </xsl:variable>
        <tr>
            <td><span class="{$bold}"><xsl:value-of select="name()"/></span></td>            
           <td><xsl:value-of select="normalize-space(text())"/></td>
        </tr>
        <xsl:apply-templates select="*"/>
    </xsl:template>
 </xsl:stylesheet>

答案 1 :(得分:0)

试试这个        

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt">
  <xsl:template match="*">
    <table>
    <xsl:for-each select="*">
      <tr>
          <td>
           <xsl:value-of select="name()"/>
            </td>
        <td>
          <xsl:value-of select="text()"/>
          </td>
        </tr>
    </xsl:for-each>
      </table>
  </xsl:template>
</xsl:stylesheet>