我怎样才能parsing这个Excel的XML导出文件与这个XSLT文件?

我们可以用这个XSL文件来parsing这个testingXML文件:

testingXML:

<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet href="newrows.xsl" type="text/xsl"?> <Workbook> <Worksheet> <Table> <Row> <Cell></Cell> <Cell>(info...)</Cell> <Cell></Cell> </Row> <Row> <Cell>first name</Cell> <Cell>last name</Cell> <Cell>age</Cell> </Row> <Row> <Cell>Jim</Cell> <Cell>Smith</Cell> <Cell>34</Cell> </Row> <Row> <Cell>Roy</Cell> <Cell>Rogers</Cell> <Cell>22</Cell> </Row> <Row> <Cell>(info...)</Cell> <Cell></Cell> <Cell>(info...)</Cell> </Row> <Row> <Cell>Sally</Cell> <Cell>Cloud</Cell> <Cell>26</Cell> </Row> <Row> <Cell>John</Cell> <Cell>Randall</Cell> <Cell>44</Cell> </Row> </Table> </Worksheet> </Workbook> 

XSL:

 <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" indent="yes"/> <xsl:param name="range-1-begin" select="1"/> <xsl:param name="range-1-end" select="3"/> <xsl:param name="range-2-begin" select="5"/> <xsl:param name="range-2-end" select="6"/> <xsl:template match="Table"> <test> <xsl:for-each select="Row"> <xsl:if test="(position() &gt;= $range-1-begin and position() &lt;= $range-1-end) or (position() &gt;= $range-2-begin and position() &lt;= $range-2-end)"> <Row> <xsl:for-each select="Cell"> <xsl:if test="position() = 1 or position() = 3"> <Cell> <xsl:value-of select="."/> </Cell> </xsl:if> </xsl:for-each> </Row> </xsl:if> </xsl:for-each> </test> </xsl:template> </xsl:stylesheet> 

但是,当我们试图parsing这个从Excel导出的类似的XML文件时 ,它将导出没有XML元素标签的每个字段内容 。 我们甚至可以inputkksljflskdjf而不是Table ,并输出每个XML元素的内容。

我必须在XML / XSL文件中更改哪些内容以便XSL文件正确parsingXML?

Excel XML(exceprts):

 <?xml version="1.0"?> <?xml-stylesheet href="blackbox.xsl" type="text/xsl"?> <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"> <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"> <Author>MM</Author> <LastAuthor>xx</LastAuthor> ... <Worksheet ss:Name="OFFSET Individual"> <Names> <NamedRange ss:Name="_FilterDatabase" ss:RefersTo="='OFFSET Individual'!R3C2:R3C12" ss:Hidden="1"/> <NamedRange ss:Name="Print_Area" ss:RefersTo="='OFFSET Individual'!R4C2:R435C15"/> <NamedRange ss:Name="Muster" ss:RefersTo="='OFFSET Individual'!C1:C9"/> <NamedRange ss:Name="PAP" ss:RefersTo="='OFFSET Individual'!C2"/> </Names> <Table ss:ExpandedColumnCount="31" ss:ExpandedRowCount="443" x:FullColumns="1" x:FullRows="1" ss:StyleID="s90" ss:DefaultColumnWidth="59" ss:DefaultRowHeight="15"> <Column ss:StyleID="s416" ss:Hidden="1" ss:AutoFitWidth="0" ss:Width="61"/> <Column ss:StyleID="s91" ss:AutoFitWidth="0" ss:Width="287"/> <Column ss:StyleID="s547" ss:AutoFitWidth="0" ss:Width="216"/> <Column ss:StyleID="s91" ss:AutoFitWidth="0" ss:Width="87"/> <Column ss:StyleID="s92" ss:AutoFitWidth="0" ss:Width="202"/> <Column ss:StyleID="s90" ss:AutoFitWidth="0" ss:Width="87"/> <Column ss:StyleID="s101" ss:AutoFitWidth="0" ss:Width="284"/> <Column ss:StyleID="s132" ss:Hidden="1" ss:AutoFitWidth="0" ss:Width="52"/> <Column ss:StyleID="s137" ss:Hidden="1" ss:AutoFitWidth="0" ss:Width="47"/> <Column ss:StyleID="s90" ss:Hidden="1" ss:AutoFitWidth="0" ss:Width="42"/> <Column ss:StyleID="s90" ss:Hidden="1" ss:AutoFitWidth="0" ss:Width="39"/> <Column ss:StyleID="s90" ss:Hidden="1" ss:AutoFitWidth="0" ss:Width="37"/> <Column ss:StyleID="s113" ss:AutoFitWidth="0" ss:Width="47"/> <Column ss:StyleID="s87" ss:Hidden="1" ss:AutoFitWidth="0" ss:Width="275"/> <Column ss:StyleID="s458" ss:AutoFitWidth="0" ss:Width="89"/> <Column ss:StyleID="s179" ss:AutoFitWidth="0" ss:Span="1"/> <Column ss:Index="18" ss:StyleID="s168" ss:Hidden="1" ss:AutoFitWidth="0"/> <Column ss:StyleID="s90" ss:Hidden="1" ss:AutoFitWidth="0"/> <Column ss:StyleID="s377" ss:AutoFitWidth="0" ss:Width="202" ss:Span="2"/> <Column ss:Index="23" ss:StyleID="s377" ss:AutoFitWidth="0" ss:Width="203"/> <Row ss:AutoFitHeight="0" ss:Height="23"> <Cell ss:Index="2" ss:StyleID="s142"> <Data ss:Type="String">Paper Overview</Data> <NamedCell ss:Name="PAP"/> <NamedCell ss:Name="Muster"/> </Cell> </Row> <Row ss:AutoFitHeight="0"> <Cell ss:Index="2" ss:StyleID="s141"> <Data ss:Type="String">Stand: 10.03.2011; 13:00 Uhr</Data> <NamedCell ss:Name="PAP"/> <NamedCell ss:Name="Muster"/> </Cell> </Row> ... 

这是一个结果“XML”文件的例子:

在这里输入图像说明

附录

这是现在的完整解决scheme,谢谢@Dimitre!

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:y="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" exclude-result-prefixes="yox ss html" > <xsl:strip-space elements="*"/> <xsl:output method="xml" indent="yes"/> <xsl:param name="range-1-begin" select="1"/> <xsl:param name="range-1-end" select="3"/> <xsl:param name="range-2-begin" select="5"/> <xsl:param name="range-2-end" select="6"/> <xsl:template match="text()"/> <xsl:template match="y:Table"> <test> <xsl:for-each select="y:Row"> <xsl:if test="(position() &gt;= $range-1-begin and position() &lt;= $range-1-end) or (position() &gt;= $range-2-begin and position() &lt;= $range-2-end)"> <Row> <xsl:for-each select="y:Cell"> <xsl:if test="position() = 1 or position() = 3"> <Cell> <xsl:value-of select="."/> </Cell> </xsl:if> </xsl:for-each> </Row> </xsl:if> </xsl:for-each> </test> </xsl:template> </xsl:stylesheet> 

我必须在XML / XSL文件中更改哪些内容以便XSL文件正确parsingXML?

首先,你的术语是相当不正确的。 XSLT转换应用于已经parsing的XML文档。 parsing(通过XMLparsing器)是能够应用转换的先决条件。

这是XML,XPath和XSLT中最常见的FAQ

不能按名称select任何元素的原因是因为在其中定义了默认名称( xmlns="urn:schemas-microsoft-com:office:spreadsheet" )。

在XPath中,任何没有前缀的名字都被认为是在“no namespace”中。 因此,模板匹配Table和selectRow元素的<xsl:for-each>将不匹配/select任何元素,因为在XML文档中没有这样的元素在“无名称空间”中。

最可读的解决scheme是在XSLT样式表中定义相同的名称空间,并在任何XPathexpression式/匹配模式中使用前缀名称。

因此,在更正的XSLT样式表中,您将拥有

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:y="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" exclude-result-prefixes="yox ss html" > <xsl:output method="xml" indent="yes"/> <xsl:param name="range-1-begin" select="1"/> <xsl:param name="range-1-end" select="3"/> <xsl:param name="range-2-begin" select="5"/> <xsl:param name="range-2-end" select="6"/> <xsl:template match="y:Table"> <test> <xsl:for-each select="y:Row"> <xsl:if test="(position() &gt;= $range-1-begin and position() &lt;= $range-1-end) or (position() &gt;= $range-2-begin and position() &lt;= $range-2-end)"> <Row> <xsl:for-each select="Cell"> <xsl:if test="position() = 1 or position() = 3"> <Cell> <xsl:value-of select="."/> </Cell> </xsl:if> </xsl:for-each> </Row> </xsl:if> </xsl:for-each> </test> </xsl:template> </xsl:stylesheet> 

您的testingXml和Xsl不声明和使用任何名称空间,而Excel Xml导出定义各种名称空间:

 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"