ASP.NET:如何将架构转换为 Excel xsl
我有以下 xml 架构:
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0">
<xs:element name="PercentTimeReport">
<xs:complexType>
<xs:sequence>
<xs:element name="ParamStartDate" type="xs:dateTime" />
<xs:element name="ParamEndDate" type="xs:dateTime" />
<xs:element name="ParamQuarterInt" type="xs:unsignedByte" />
<xs:element name="ParamProjID" nillable="true" />
<xs:element name="ParamStaffID" nillable="true" />
<xs:element name="ParamPercentRange" type="xs:unsignedByte" />
<xs:element name="Items">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="Item">
<xs:complexType>
<xs:sequence>
<xs:element name="ID" type="xs:unsignedShort" />
<xs:element name="EmployeeName" type="xs:string" />
<xs:element name="StaffID" type="xs:unsignedShort" />
<xs:element name="Status" type="xs:string" />
<xs:element name="Date" type="xs:dateTime" />
<xs:element name="Department" type="xs:string" />
<xs:element name="DepartmentCode" type="xs:string" />
<xs:element name="Project" type="xs:string" />
<xs:element name="ProjectID" type="xs:unsignedByte" />
<xs:element name="Hours" type="xs:unsignedByte" />
<xs:element name="HoursPerWeek" type="xs:decimal" />
<xs:element name="PercentTime" type="xs:decimal" />
<xs:element name="ActualContact" type="xs:boolean" />
<xs:element name="Body" type="xs:string" />
<xs:element name="Issue" type="xs:string" />
<xs:element name="Activity" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xsd:schema>
并且我想生成一个 excel 文件,该文件仅显示 ASP.NET 2.0 Web 应用程序中的 Items 表。我真的不明白这个我发现的代码(见下文),或者XSLT足以获得我需要的输出格式。有谁知道 XSLT,可以告诉我如何修改下面的 XSLT 来:
1)隐藏除 Items 之外的元素(例如 ParamStartDate、ParamEndDate 等)。
2) 输出带有嵌套“Items”复杂元素的表。
目前,下面的 xsl 生成每个元素作为列标题,并且 Items 单元格包含一行上的所有项目。我本质上需要更深入一层。
<xsl:template match="/">
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40">
<xsl:apply-templates/>
</Workbook>
</xsl:template>
<xsl:template match="/*">
<Worksheet>
<xsl:attribute name="ss:Name">
<xsl:value-of select="local-name(/*/*)"/>
</xsl:attribute>
<Table x:FullColumns="1" x:FullRows="1">
<Row>
<xsl:for-each select="*[position() = 1]/*">
<Cell>
<Data ss:Type="String">
<xsl:value-of select="local-name()"/>
</Data>
</Cell>
</xsl:for-each>
</Row>
<xsl:apply-templates/>
</Table>
</Worksheet>
</xsl:template>
<xsl:template match="/*/*">
<Row>
<xsl:apply-templates/>
</Row>
</xsl:template>
<xsl:template match="/*/*/*">
<Cell>
<Data ss:Type="String">
<xsl:value-of select="."/>
</Data>
</Cell>
</xsl:template>
所需的 Excel 输出(仅将项目复杂类型显示为表):
ID EmployeeName StaffID .... Issue Activity 1 John Smith 231 .... text text 2 Kate Henderson 101 .... text2 text3 . .... . .... N ....
当前输出:
ParamStartDate ParamEndDate .... ParamPercentRange Items '01/01/2010' '04/01/2010' .... 6 '1John Smith231...texttext....'
一如既往,非常感谢任何帮助。
你
谢谢 Alejandro,这是您所做更改的输出:
<?xml version="1.0" encoding="utf-8"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40">
<Worksheet ss:Name="PercentTimeReport">
<Table x:FullColumns="1" x:FullRows="1">
<Row />
</Table>
</Worksheet>
</Workbook>
这是我的原始输出的示例:
<?xml version="1.0" encoding="utf-8"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:user="urn:my-scripts">
<Worksheet ss:Name="PercentTimeReport">
<Table x:FullColumns="1" x:FullRows="1">
<Row>
<Cell><Data ss:Type="String">ParamStartDate</Data></Cell><Cell><Data ss:Type="String">ParamEndDate</Data></Cell><Cell><Data ss:Type="String">ParamQuarterInt</Data></Cell><Cell><Data ss:Type="String">ParamPercentRange</Data></Cell><Cell><Data ss:Type="String">Items</Data></Cell>
</Row>
<Row>
<Cell><Data ss:Type="String">2010-07-01T00:00:00</Data></Cell><Cell><Data ss:Type="String">2010-09-30T00:00:00</Data></Cell>....</Cell>
</Row>
</Table>
</Worksheet>
</Workbook>
I have the following xml schema:
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0">
<xs:element name="PercentTimeReport">
<xs:complexType>
<xs:sequence>
<xs:element name="ParamStartDate" type="xs:dateTime" />
<xs:element name="ParamEndDate" type="xs:dateTime" />
<xs:element name="ParamQuarterInt" type="xs:unsignedByte" />
<xs:element name="ParamProjID" nillable="true" />
<xs:element name="ParamStaffID" nillable="true" />
<xs:element name="ParamPercentRange" type="xs:unsignedByte" />
<xs:element name="Items">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="Item">
<xs:complexType>
<xs:sequence>
<xs:element name="ID" type="xs:unsignedShort" />
<xs:element name="EmployeeName" type="xs:string" />
<xs:element name="StaffID" type="xs:unsignedShort" />
<xs:element name="Status" type="xs:string" />
<xs:element name="Date" type="xs:dateTime" />
<xs:element name="Department" type="xs:string" />
<xs:element name="DepartmentCode" type="xs:string" />
<xs:element name="Project" type="xs:string" />
<xs:element name="ProjectID" type="xs:unsignedByte" />
<xs:element name="Hours" type="xs:unsignedByte" />
<xs:element name="HoursPerWeek" type="xs:decimal" />
<xs:element name="PercentTime" type="xs:decimal" />
<xs:element name="ActualContact" type="xs:boolean" />
<xs:element name="Body" type="xs:string" />
<xs:element name="Issue" type="xs:string" />
<xs:element name="Activity" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xsd:schema>
and I'd like to generate an excel file that only shows the Items table in an ASP.NET 2.0 Web application. I really don't understand this code that I found (see below), or XSLT enough to get the output format that I need. Does anyone know XSLT, that could tell me how to modify the XSLT below to:
1) Hide the elements other than Items (e.g. ParamStartDate, ParamEndDate, etc.).
2) Output the table with the nested "Items" complex element.
Currently, the xsl below produces each of the elements as column headers, and the Items cell contains all the items on one row. I essentially need to go one level deeper.
<xsl:template match="/">
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40">
<xsl:apply-templates/>
</Workbook>
</xsl:template>
<xsl:template match="/*">
<Worksheet>
<xsl:attribute name="ss:Name">
<xsl:value-of select="local-name(/*/*)"/>
</xsl:attribute>
<Table x:FullColumns="1" x:FullRows="1">
<Row>
<xsl:for-each select="*[position() = 1]/*">
<Cell>
<Data ss:Type="String">
<xsl:value-of select="local-name()"/>
</Data>
</Cell>
</xsl:for-each>
</Row>
<xsl:apply-templates/>
</Table>
</Worksheet>
</xsl:template>
<xsl:template match="/*/*">
<Row>
<xsl:apply-templates/>
</Row>
</xsl:template>
<xsl:template match="/*/*/*">
<Cell>
<Data ss:Type="String">
<xsl:value-of select="."/>
</Data>
</Cell>
</xsl:template>
Desired Excel Output (Only show Items complexType as Table):
ID EmployeeName StaffID .... Issue Activity 1 John Smith 231 .... text text 2 Kate Henderson 101 .... text2 text3 . .... . .... N ....
Current Output:
ParamStartDate ParamEndDate .... ParamPercentRange Items '01/01/2010' '04/01/2010' .... 6 '1John Smith231...texttext....'
As always, any help greatly appreciated.
Thank You
P.S. Alejandro, here's the output with your changes:
<?xml version="1.0" encoding="utf-8"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40">
<Worksheet ss:Name="PercentTimeReport">
<Table x:FullColumns="1" x:FullRows="1">
<Row />
</Table>
</Worksheet>
</Workbook>
Here is a sample of my original output:
<?xml version="1.0" encoding="utf-8"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:user="urn:my-scripts">
<Worksheet ss:Name="PercentTimeReport">
<Table x:FullColumns="1" x:FullRows="1">
<Row>
<Cell><Data ss:Type="String">ParamStartDate</Data></Cell><Cell><Data ss:Type="String">ParamEndDate</Data></Cell><Cell><Data ss:Type="String">ParamQuarterInt</Data></Cell><Cell><Data ss:Type="String">ParamPercentRange</Data></Cell><Cell><Data ss:Type="String">Items</Data></Cell>
</Row>
<Row>
<Cell><Data ss:Type="String">2010-07-01T00:00:00</Data></Cell><Cell><Data ss:Type="String">2010-09-30T00:00:00</Data></Cell>....</Cell>
</Row>
</Table>
</Worksheet>
</Workbook>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
在与
/*
您的上下文匹配的模板内(遵循您提供的架构)是PercentTimeReport
根元素。您似乎想通过PercentTimeReport/Items/Item
的子元素进行迭代。因此更改:
对于: 对于
并且
:对于:
这个模式:
对于:
编辑:此输入(以下架构)
使用此样式表(您的加上我的更改)
输出:
Inside the template that match
/*
your context (following the schema you've privided) isPercentTimeReport
root element. It seems that you want to iterate trougth child elements ofPercentTimeReport/Items/Item
.So change:
For:
And this:
For:
And this patterns:
For:
Edit: This input (following schema)
With this stylesheet (Yours plus my changes)
Output: