Мы можем разобрать этот тестовый XML-файл с этим штрафом XSL-файла:
Тест XML:
<?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() >= $range-1-begin and position() <= $range-1-end)
or (position() >= $range-2-begin and position() <= $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>
Однако, когда мы пытаемся проанализировать этот аналогичный XML-файл, экспортированный из Excel , он экспортирует содержимое каждого поля без тегов элемента XML . Мы можем даже ввести kksljflskdjf
вместо Table
, и он выведет содержимое каждого элемента XML.
Что мне нужно изменить в файле XML / XSL, чтобы файл XSL правильно анализировал XML?
Excel XML (отрывки):
<?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":
Добавление
Это полное решение, которое теперь работает, спасибо @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="y o x 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() >= $range-1-begin and position() <= $range-1-end)
or (position() >= $range-2-begin and position() <= $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>