我需要更改现有的xml才能从中创建一个excel表。
我需要更改的xml:
<rows>
<row>
<cell image="blank.gif">Row1</cell>
<cell>1</cell>
<cell>2</cell>
<cell>3</cell>
<cell>4</cell>
<cell>5</cell>
<cell>6</cell>
<cell>7</cell>
<row>
<cell image="blank.gif">Row1_1</cell>
<cell>8</cell>
<cell>9</cell>
<cell>10</cell>
<cell>11</cell>
<cell>12</cell>
<cell>13</cell>
<cell>14</cell>
</row>
<row>
<cell image="blank.gif">Row1_2</cell>
<cell>15</cell>
<cell>16</cell>
<cell>17</cell>
<cell>18</cell>
<cell>19</cell>
<cell>20</cell>
<cell>21</cell>
</row>
</row>
<row>
<cell image="blank.gif">Row2</cell>
<cell>22</cell>
<cell>23</cell>
<cell>24</cell>
<cell>25</cell>
<cell>26</cell>
<cell>27</cell>
<cell>28</cell>
</row>
</rows>
我目前的XSLT:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="rows">
<xsl:element name="sheetData">
<xsl:apply-templates select="row"></xsl:apply-templates>
</xsl:element>
</xsl:template>
<xsl:template match="row">
<xsl:variable name="rowID">
<xsl:number value="position()" format="1"/>
</xsl:variable>
<xsl:element name="row">
<xsl:attribute name="r">
<xsl:value-of select="$rowID"/>
</xsl:attribute>
<xsl:for-each select="*">
<xsl:element name="c">
<xsl:variable name="colID">
<xsl:number value="position()" format="A"/>
</xsl:variable>
<xsl:attribute name="r">
<xsl:value-of select="concat(string($colID),string($rowID))"/>
</xsl:attribute>
<xsl:attribute name="t">
<xsl:text>inlineStr</xsl:text>
</xsl:attribute>
<xsl:element name="is">
<xsl:element name="t">
<xsl:value-of select="."/>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
我的转换输出:
<sheetData>
<row r="1">
<c r="A1" t="inlineStr">
<is>
<t>Row1</t>
</is>
</c>
<c r="B1" t="inlineStr">
<is>
<t>1</t>
</is>
</c>
<c r="C1" t="inlineStr">
<is>
<t>2</t>
</is>
</c>
<c r="D1" t="inlineStr">
<is>
<t>3</t>
</is>
</c>
<c r="E1" t="inlineStr">
<is>
<t>4</t>
</is>
</c>
<c r="F1" t="inlineStr">
<is>
<t>5</t>
</is>
</c>
<c r="G1" t="inlineStr">
<is>
<t>6</t>
</is>
</c>
<c r="H1" t="inlineStr">
<is>
<t>7</t>
</is>
</c>
<c r="I1" t="inlineStr">
<is>
<t>Row1_1891011121314</t>
</is>
</c>
<c r="J1" t="inlineStr">
<is>
<t>Row1_215161718192021</t>
</is>
</c>
</row>
<row r="2">
<c r="A2" t="inlineStr">
<is>
<t>Row2</t>
</is>
</c>
<c r="B2" t="inlineStr">
<is>
<t>22</t>
</is>
</c>
<c r="C2" t="inlineStr">
<is>
<t>23</t>
</is>
</c>
<c r="D2" t="inlineStr">
<is>
<t>24</t>
</is>
</c>
<c r="E2" t="inlineStr">
<is>
<t>25</t>
</is>
</c>
<c r="F2" t="inlineStr">
<is>
<t>26</t>
</is>
</c>
<c r="G2" t="inlineStr">
<is>
<t>27</t>
</is>
</c>
<c r="H2" t="inlineStr">
<is>
<t>28</t>
</is>
</c>
</row>
</sheetData>
生成的Excel文档中的截图:
所以我的问题是嵌套行我需要像Row1和Row2一样显示它们
答案 0 :(得分:1)
我认为你所说的是你想在输入XML中为每个行输出一个单独的行,即使行元素是嵌套的。
首先,您需要替换此行
<xsl:for-each select="*">
有了......
<xsl:for-each select="cell">
这将确保仅在当前行中输出单元格元素,并且不会处理嵌套的行元素。
然后,在仅使用单元格元素创建行元素后,您可以查找嵌套的行元素以输出这些元素
<row>
<!-- Process Cells -->
</row>
<xsl:apply-templates select="row"/>
请注意,没有必要使用 xsl:element 来输出静态命名元素,只需直接写出元素即可。您也可以通过使用属性值模板来创建属性来整理您的代码,而不是使用 xsl:attribute
尝试以下XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="rows">
<sheetData>
<xsl:apply-templates select="row"/>
</sheetData>
</xsl:template>
<xsl:template match="row">
<xsl:variable name="rowID">
<xsl:number level="any" format="1"/>
</xsl:variable>
<row r="{$rowID}">
<xsl:for-each select="cell">
<xsl:variable name="colID">
<xsl:number value="position()" format="A"/>
</xsl:variable>
<c t="inlineStr" r="{string($colID)}{string($rowID)}">
<is>
<t>
<xsl:value-of select="."/>
</t>
</is>
</c>
</xsl:for-each>
</row>
<xsl:apply-templates select="row"/>
</xsl:template>
</xsl:stylesheet>
应用于XML时,输出以下内容
<sheetData>
<row r="1">
<c t="inlineStr" r="A1">
<is>
<t>Row1</t>
</is>
</c>
<c t="inlineStr" r="B1">
<is>
<t>1</t>
</is>
</c>
<c t="inlineStr" r="C1">
<is>
<t>2</t>
</is>
</c>
<c t="inlineStr" r="D1">
<is>
<t>3</t>
</is>
</c>
<c t="inlineStr" r="E1">
<is>
<t>4</t>
</is>
</c>
<c t="inlineStr" r="F1">
<is>
<t>5</t>
</is>
</c>
<c t="inlineStr" r="G1">
<is>
<t>6</t>
</is>
</c>
<c t="inlineStr" r="H1">
<is>
<t>7</t>
</is>
</c>
</row>
<row r="2">
<c t="inlineStr" r="A2">
<is>
<t>Row1_1</t>
</is>
</c>
<c t="inlineStr" r="B2">
<is>
<t>8</t>
</is>
</c>
<c t="inlineStr" r="C2">
<is>
<t>9</t>
</is>
</c>
<c t="inlineStr" r="D2">
<is>
<t>10</t>
</is>
</c>
<c t="inlineStr" r="E2">
<is>
<t>11</t>
</is>
</c>
<c t="inlineStr" r="F2">
<is>
<t>12</t>
</is>
</c>
<c t="inlineStr" r="G2">
<is>
<t>13</t>
</is>
</c>
<c t="inlineStr" r="H2">
<is>
<t>14</t>
</is>
</c>
</row>
<row r="3">
<c t="inlineStr" r="A3">
<is>
<t>Row1_2</t>
</is>
</c>
<c t="inlineStr" r="B3">
<is>
<t>15</t>
</is>
</c>
<c t="inlineStr" r="C3">
<is>
<t>16</t>
</is>
</c>
<c t="inlineStr" r="D3">
<is>
<t>17</t>
</is>
</c>
<c t="inlineStr" r="E3">
<is>
<t>18</t>
</is>
</c>
<c t="inlineStr" r="F3">
<is>
<t>19</t>
</is>
</c>
<c t="inlineStr" r="G3">
<is>
<t>20</t>
</is>
</c>
<c t="inlineStr" r="H3">
<is>
<t>21</t>
</is>
</c>
</row>
<row r="4">
<c t="inlineStr" r="A4">
<is>
<t>Row2</t>
</is>
</c>
<c t="inlineStr" r="B4">
<is>
<t>22</t>
</is>
</c>
<c t="inlineStr" r="C4">
<is>
<t>23</t>
</is>
</c>
<c t="inlineStr" r="D4">
<is>
<t>24</t>
</is>
</c>
<c t="inlineStr" r="E4">
<is>
<t>25</t>
</is>
</c>
<c t="inlineStr" r="F4">
<is>
<t>26</t>
</is>
</c>
<c t="inlineStr" r="G4">
<is>
<t>27</t>
</is>
</c>
<c t="inlineStr" r="H4">
<is>
<t>28</t>
</is>
</c>
</row>
</sheetData>
答案 1 :(得分:0)
您可以做的另一件事是按原样导入XML。