我正在尝试使用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>
答案 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>