使用XSL问题将XML转换为HTML,根据属性值动态选择所有子节点

时间:2015-03-30 14:14:51

标签: html xml xslt

我正在尝试使用XSL将XML报告呈现为HTML。 XSL不会根据格式或任何内容返回错误(使用Altova XMLSpy应用程序检查),但不提供我期望的正确html表。 下面是我的XML代码和我的XSL代码。 我需要的是,因为我的XML节点/标记<row></row>并不总是有<key>个标记或<value>标记,但它可能会不时出现,就是列出所有这些子标记无论如何,动态地xsl到html表。 例如下面我想生成一个HTML表,其中包含行的行数,每行都列出了列,在这种情况下将列出:

  

第1列= Institution_Id
  第2栏=第
节   第3栏=类别
  第4栏= SUBCATEGORY
  第5栏=项目
  *第6列= VALUE
   column7 = SHORTCODE

并且行应该是

  

1
   2
   。
   。    8
   9
   。
   。
   。

ps:*正如您从xml中看到的那样,第6列与其他<key> vs <value>的标记名称不同,这可以通过其他案例来完成,例如<key> vs <item>

XML代码:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="ParamStyleSTAVROS.xsl"?>
<Report>
<Header></Header>
<Results Property="Comparison Results">
    <row number="1" type="equal">
        <key column="Institution_Id" left="CNTR"/>
        <key column="Institution_Id" right="CNTR"/>
    </row>
    <row number="1" type="equal">
        <key column="SECTION" left="AMEX"/>
        <key column="SECTION" right="AMEX"/>
    </row>
    <row number="1" type="equal">
        <key column="CATEGORY" left="reason codes"/>
        <key column="CATEGORY" right="reason codes"/>
    </row>
    <row number="1" type="equal">
        <key column="SUBCATEGORY" left="exception reason codes"/>
        <key column="SUBCATEGORY" right="exception reason codes"/>
    </row>
    <row number="1" type="equal">
        <key column="ITEM" left="3000 - Lost card"/>
        <key column="ITEM" right="3000 - Lost card"/>
    </row>
    <row number="1" type="equal">
        <value column="VALUE" left="3000"/>
        <value column="VALUE" right="3000.0"/>
    </row>
    <row number="1" type="equal">
        <key column="SHORTCODE" left="DEFP"/>
        <key column="SHORTCODE" right="DEFP"/>
    </row>
    <row number="2" type="equal">
        <key column="Institution_Id" left="CNTR"/>
        <key column="Institution_Id" right="CNTR"/>
    </row>
    <row number="2" type="equal">
        <key column="SECTION" left="AMEX"/>
        <key column="SECTION" right="AMEX"/>
    </row>
    <row number="2" type="equal">
        <key column="CATEGORY" left="reason codes"/>
        <key column="CATEGORY" right="reason codes"/>
    </row>
    <row number="2" type="equal">
        <key column="SUBCATEGORY" left="exception reason codes"/>
        <key column="SUBCATEGORY" right="exception reason codes"/>
    </row>
    <row number="2" type="equal">
        <key column="ITEM" left="3001 - Stolen Card"/>
        <key column="ITEM" right="3001 - Stolen Card"/>
    </row>
    <row number="2" type="equal">
        <value column="VALUE" left="3001"/>
        <value column="VALUE" right="3001.0"/>
    </row>
    <row number="2" type="equal">
        <key column="SHORTCODE" left="DEFP"/>
        <key column="SHORTCODE" right="DEFP"/>
    </row>
    .
    .
    .
    .
    .
    .
    <row number="8" type="orphaned">
        <key column="Institution_Id" left=""/>
        <key column="Institution_Id" right="CNTR"/>
    </row>
    <row number="8" type="orphaned">
        <key column="SECTION" left=""/>
        <key column="SECTION" right="AMEX"/>
    </row>
    <row number="8" type="orphaned">
        <key column="CATEGORY" left=""/>
        <key column="CATEGORY" right="Statistics"/>
    </row>
    <row number="8" type="orphaned">
        <key column="SUBCATEGORY" left=""/>
        <key column="SUBCATEGORY" right="Product"/>
    </row>
    <row number="8" type="orphaned">
        <key column="ITEM" left=""/>
        <key column="ITEM" right="product line"/>
    </row>
    <row number="8" type="orphaned">
        <value column="VALUE" left=""/>
        <value column="VALUE" right="NULL"/>
    </row>
    <row number="8" type="orphaned">
        <key column="SHORTCODE" left=""/>
        <key column="SHORTCODE" right="DEFP"/>
    </row>
    <row number="9" type="orphaned">
        <key column="Institution_Id" left=""/>
        <key column="Institution_Id" right="CNTR"/>
    </row>
    <row number="9" type="orphaned">
        <key column="SECTION" left=""/>
        <key column="SECTION" right="AMEX"/>
    </row>
    <row number="9" type="orphaned">
        <key column="CATEGORY" left=""/>
        <key column="CATEGORY" right="Statistics"/>
    </row>
    <row number="9" type="orphaned">
        <key column="SUBCATEGORY" left=""/>
        <key column="SUBCATEGORY" right="Product"/>
    </row>
    <row number="9" type="orphaned">
        <key column="ITEM" left=""/>
        <key column="ITEM" right="product name"/>
    </row>
    <row number="9" type="orphaned">
        <value column="VALUE" left=""/>
        <value column="VALUE" right="NULL"/>
    </row>
    <row number="9" type="orphaned">
        <key column="SHORTCODE" left=""/>
        <key column="SHORTCODE" right="DEFP"/>
    </row>
    .
    .
    .
    .
    .
    .
    .
</Results>
</Report>

XSL代码:

<xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:template match="/Report/Header">

<html>
<style>
h1{
font-family: Gill Sans, Verdana;
font-size: 11px;
line-height: px;
text-transform: uppercase;
letter-spacing: 2px;
font-weight: bold;
}
table,th,td{
font-family: Gill Sans, Verdana;
text-transform: uppercase;
letter-spacing: 2px;
font-weight: bold;
border: 1px solid black;
border-collapse: collapse;
width:100%;
}
td{
font-size: 11px;
padding:5px;
}
th{
font-size: 18px;
height: 20px;
padding:5px;
background-color: yellow;
color: black;
}


</style>

<head>
    <h1>Comparison Report Information</h1>
        <table>
            <th>ReportCreated</th>
            <th>Product</th>
            <th>PrimaryDB</th>
            <th>PrimaryDBMS</th>
            <th>SecondaryDB</th>    
            <th>SecondaryDBMS</th>  
        <tr>
            <xsl:for-each select="Property">
            <td>
            <xsl:value-of select="@*"></xsl:value-of>
            </td>
            </xsl:for-each>
        </tr>

        </table>
</head>
<body>

        <h1>Results</h1>
        <br></br>
<table>

    <xsl:for-each select="row/@number">
        <tr>
            <xsl:for-each select="row">
                <th>
                    <xsl:value-of select="@*"></xsl:value-of>       
                </th>
            </xsl:for-each>
        </tr>

        <tr>
            <td>
                <xsl:value-of select="."></xsl:value-of>        
            </td>
        </tr>
    </xsl:for-each>
</table>

</body>
 </html>
</xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:0)

要解决此问题,您可以使用名为Muenchian Grouping的技术。这可用于获取不同的列,也可用于按row属性对number元素进行分组。

要获取不同的列名,首先要定义一个这样的键(这假设始终存在column属性

<xsl:key name="columns" match="row/*" use="@column" />

要使用它,要获得不同的列名,请执行此操作...

<xsl:variable 
     name="columns" 
     select="//row/*[generate-id() = generate-id(key('columns', @column)[1])]/@column"/>

对于行,您需要按编号对row元素进行分组,因此您可以定义这样的键

<xsl:key name="rows" match="row" use="@number" />

然后,要获得第一次出现的row元素,请执行此操作

<xsl:for-each select="row[generate-id() = generate-id(key('rows', @number)[1])]">

然后,要获取构成表行的row元素,请使用该键获取具有相同数字的所有行

<xsl:variable name="row" select="key('rows', @number)" />

为初学者尝试这个XSLT:

<xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>

<xsl:key name="columns" match="row/*" use="@column" />
<xsl:key name="rows" match="row" use="@number" />

<xsl:template match="/Report/Results">
    <xsl:variable name="columns" select="//row/*[generate-id() = generate-id(key('columns', @column)[1])]/@column"/>
    <html>
    <head>
        <title>Table</title>
    </head>
    <body>
    <table>
        <thead>
        <tr>
            <th>Row Number</th>
            <xsl:for-each select="$columns">
                <th><xsl:value-of select="." /></th>
            </xsl:for-each>
        </tr>
        </thead>
        <xsl:for-each select="row[generate-id() = generate-id(key('rows', @number)[1])]">
            <xsl:variable name="row" select="key('rows', @number)" />
            <tr>
                <td>
                    <xsl:value-of select="@number" />
                </td>
                <xsl:for-each select="$columns">
                    <td>
                        <xsl:value-of select="$row/*[@column = current()]/@right" />
                    </td>
                </xsl:for-each>
            </tr>
        </xsl:for-each>
    </table>
    </body>
    </html>
</xsl:template>
</xsl:stylesheet>