使用xslt 1.0将xml转换为表格式

时间:2015-08-14 14:05:24

标签: xml xslt

我不太明白如何在下面看到一个示例,转换成下面的表格格式。

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="sample.xsl"?>
<Form name="Sample Form">
<Prop title="Name">
<PropList type="list">
<Item value="Joe"></Item>
<Item value="Anna"></Item>
<Item value="Mark"></Item></PropList></Prop>
<Prop title="ID">
<PropList type="list">
<Item value="123"></Item>
<Item value="789"></Item>
<Item value="345"></Item></PropList></Prop>
<Prop title="Code">
<PropList type="list">
<Item value="WFUO"></Item>
<Item value="SOP"></Item>
<Item value="ASAP"></Item></PropList></Prop></Form>

想要输出:抱歉,我无法发布图片

Joe  123 WFUO
Anna 789 SOP
Mark 345 ASAP

我只能将它输出到一行或一行。如果你能提供帮助,请告诉我。

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  version="1.0">
    <xsl:template match="/">
        <html>
            <head><title>Sample Form</title></head>
            <body>
                <table border="1">
                <tr>
                    <th>Name</th>
                    <th>ID</th>
                    <th>Code</th>
                </tr>
                <xsl:apply-templates select='Form/Prop/PropList/Item'/>
            </table>
            </body></html>
    </xsl:template>

    <xsl:template match="Prop">
        <tr>
            <td><xsl:value-of select="@value"/></td>
            <xsl:apply-templates select='Form/Prop/PropList/Item'/>
        </tr>
    </xsl:template>

    <xsl:template match="Item">
        <tr>
            <td><xsl:value-of select="@value"/></td>
            <xsl:apply-templates select='Form/Prop/PropList/Item'/>
        </tr>
    </xsl:template>

</xsl:stylesheet>

在其他成员的帮助下获得新的更新代码:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:key name="PropKey" match="Prop" use="@title" />

  <xsl:template match="Form">
         <html>
            <head><title>Sample Form</title></head>
            <body>
                <table border="1">
                <tr>
                    <th>Name</th>
                    <th>ID</th>
                    <th>Code</th>
                </tr>
                <xsl:apply-templates select='Prop'/>
            </table>
            </body></html>
  </xsl:template>

  <xsl:template match="Prop">
    <xsl:variable name="thisGroup" select="key('PropKey', @title)">   </xsl:variable>
    <xsl:value-of select="$thisGroup"/> 
    <xsl:if test="generate-id() = generate-id($thisGroup[1])">
          <xsl:apply-templates select="PropList"/>  
    </xsl:if> 

  </xsl:template>

  <xsl:template match="PropList">
     <td>
        <xsl:value-of select="Item/@value"/>
     </td>           
  </xsl:template>

1 个答案:

答案 0 :(得分:1)

您向我们展示的输出需要转动表格。一种更简单的方法会以现有方向显示表格:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/Form">
    <html>
        <head><title>Sample Form</title></head>
        <body>
            <table border="1">
                <xsl:apply-templates select='Prop'/>
            </table>
        </body>
    </html>
</xsl:template>

<xsl:template match="Prop">
    <tr>
        <th><xsl:value-of select="@title"/></th>
        <xsl:apply-templates select='PropList/Item'/>
    </tr>
</xsl:template>

<xsl:template match="Item">
        <td><xsl:value-of select="@value"/></td>
</xsl:template>

</xsl:stylesheet>

结果(已呈现)

enter image description here

修改

正如我所说,如果你想改变桌子的方向,你必须更加努力地工作:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/Form">
    <html>
        <head><title>Sample Form</title></head>
        <body>
            <table border="1">
                <!-- header -->
                <xsl:for-each select="Prop">
                    <th><xsl:value-of select="@title"/></th>
                </xsl:for-each>
                <!-- body -->
                <xsl:for-each select="Prop[1]/PropList/Item">
                    <xsl:variable name="i" select="position()"/>
                    <tr>
                        <xsl:for-each select="/Form/Prop/PropList">
                            <td><xsl:value-of select="Item[$i]/@value"/></td>
                        </xsl:for-each>
                    </tr>
                </xsl:for-each>
            </table>
        </body>
    </html>
</xsl:template>

</xsl:stylesheet>

结果(已呈现)

enter image description here