作为XML和XSLT的新来者,我已根据我的要求生成了代码。但是,我想使用XSL:模板简化我的XSLT。请告知如何使用模板执行以下代码。
<xsl:variable name="d1">
<xsl:value-of select="ss:Cell[15]/ss:index"/>
<xsl:choose>
<xsl:when test="$d1=16"><XDT_WW2><xsl:value-of select="ss:Cell[15]/ss:Data"/></XDT_WW2></xsl:when>
<xsl:when test="$d1=17"><XDT_WW3><xsl:value-of select="ss:Cell[15]/ss:Data"/></XDT_WW3></xsl:when>
<xsl:when test="$d1=18"><XDT_WW4><xsl:value-of select="ss:Cell[15]/ss:Data"/></XDT_WW4></xsl:when>
<xsl:when test="$d1=19"><XDT_WW5><xsl:value-of select="ss:Cell[15]/ss:Data"/></XDT_WW5></xsl:when>
<xsl:when test="$d1=20"><XDT_WW6><xsl:value-of select="ss:Cell[15]/ss:Data"/></XDT_WW6></xsl:when>
<xsl:when test="$d1=21"><XDT_WW7><xsl:value-of select="ss:Cell[15]/ss:Data"/></XDT_WW7></xsl:when>
<xsl:when test="$d1=22"><XDT_WW8><xsl:value-of select="ss:Cell[15]/ss:Data"/></XDT_WW8></xsl:when>
<xsl:when test="$d1=23"><XDT_WW9><xsl:value-of select="ss:Cell[15]/ss:Data"/></XDT_WW9></xsl:when>
<xsl:when test="$d1=24"><XDT_WW10><xsl:value-of select="ss:Cell[15]/ss:Data"/></XDT_WW10></xsl:when>
<xsl:when test="$d1=25"><XDT_WW11><xsl:value-of select="ss:Cell[15]/ss:Data"/></XDT_WW11></xsl:when>
<xsl:when test="$d1=26"><XDT_WW12><xsl:value-of select="ss:Cell[15]/ss:Data"/></XDT_WW12></xsl:when>
<xsl:when test="$d1=27"><XDT_WW13><xsl:value-of select="ss:Cell[15]/ss:Data"/></XDT_WW13></xsl:when>
<xsl:when test="$d1=28"><XDT_WW14><xsl:value-of select="ss:Cell[15]/ss:Data"/></XDT_WW14></xsl:when>
<xsl:when test="$d1=29"><XDT_WW15><xsl:value-of select="ss:Cell[15]/ss:Data"/></XDT_WW15></xsl:when>
<xsl:when test="$d1=30"><XDT_WW16><xsl:value-of select="ss:Cell[15]/ss:Data"/></XDT_WW16></xsl:when>
<xsl:when test="$d1=31"><XDT_WW17><xsl:value-of select="ss:Cell[15]/ss:Data"/></XDT_WW17></xsl:when>
<xsl:when test="$d1=32"><XDT_WW18><xsl:value-of select="ss:Cell[15]/ss:Data"/></XDT_WW18></xsl:when>
<xsl:when test="$d1=33"><XDT_WW19><xsl:value-of select="ss:Cell[15]/ss:Data"/></XDT_WW19></xsl:when>
<xsl:when test="$d1=34"><XDT_WW20><xsl:value-of select="ss:Cell[15]/ss:Data"/></XDT_WW20></xsl:when>
<xsl:when test="$d1=35"><XDT_WW21><xsl:value-of select="ss:Cell[15]/ss:Data"/></XDT_WW21></xsl:when>
<xsl:when test="$d1=36"><XDT_WW22><xsl:value-of select="ss:Cell[15]/ss:Data"/></XDT_WW22></xsl:when>
<xsl:when test="$d1=37"><XDT_WW23><xsl:value-of select="ss:Cell[15]/ss:Data"/></XDT_WW23></xsl:when>
<xsl:when test="$d1=38"><XDT_WW24><xsl:value-of select="ss:Cell[15]/ss:Data"/></XDT_WW24></xsl:when>
<xsl:when test="$d1=39"><XDT_WW25><xsl:value-of select="ss:Cell[15]/ss:Data"/></XDT_WW25></xsl:when>
<xsl:when test="$d1=40"><XDT_WW26><xsl:value-of select="ss:Cell[15]/ss:Data"/></XDT_WW26></xsl:when>
<xsl:when test="$d1=41"><XDT_WW27><xsl:value-of select="ss:Cell[15]/ss:Data"/></XDT_WW27></xsl:when>
<xsl:when test="$d1=42"><XDT_WW28><xsl:value-of select="ss:Cell[15]/ss:Data"/></XDT_WW28></xsl:when>
<xsl:when test="$d1=43"><XDT_WW29><xsl:value-of select="ss:Cell[15]/ss:Data"/></XDT_WW29></xsl:when>
<xsl:when test="$d1=44"><XDT_WW30><xsl:value-of select="ss:Cell[15]/ss:Data"/></XDT_WW30></xsl:when>
<xsl:when test="$d1=45"><XDT_WW31><xsl:value-of select="ss:Cell[15]/ss:Data"/></XDT_WW31></xsl:when>
<xsl:when test="$d1=46"><XDT_WW32><xsl:value-of select="ss:Cell[15]/ss:Data"/></XDT_WW32></xsl:when>
<xsl:when test="$d1=47"><XDT_WW33><xsl:value-of select="ss:Cell[15]/ss:Data"/></XDT_WW33></xsl:when>
<xsl:otherwise><XDT_WW1><xsl:value-of select="ss:Cell[15]/ss:Data"/></XDT_WW1></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="d2">
<xsl:value-of select="ss:Cell[16]/ss:index"/>
<xsl:choose>
<xsl:when test="$d2=17"><XDT_WW3><xsl:value-of select="ss:Cell[16]/ss:Data"/></XDT_WW3></xsl:when>
<xsl:when test="$d2=18"><XDT_WW4><xsl:value-of select="ss:Cell[16]/ss:Data"/></XDT_WW4></xsl:when>
<xsl:when test="$d2=19"><XDT_WW5><xsl:value-of select="ss:Cell[16]/ss:Data"/></XDT_WW5></xsl:when>
<xsl:when test="$d2=20"><XDT_WW6><xsl:value-of select="ss:Cell[16]/ss:Data"/></XDT_WW6></xsl:when>
<xsl:when test="$d2=21"><XDT_WW7><xsl:value-of select="ss:Cell[16]/ss:Data"/></XDT_WW7></xsl:when>
<xsl:when test="$d2=22"><XDT_WW8><xsl:value-of select="ss:Cell[16]/ss:Data"/></XDT_WW8></xsl:when>
<xsl:when test="$d2=23"><XDT_WW9><xsl:value-of select="ss:Cell[16]/ss:Data"/></XDT_WW9></xsl:when>
<xsl:when test="$d2=24"><XDT_WW10><xsl:value-of select="ss:Cell[16]/ss:Data"/></XDT_WW10></xsl:when>
<xsl:when test="$d2=25"><XDT_WW11><xsl:value-of select="ss:Cell[16]/ss:Data"/></XDT_WW11></xsl:when>
<xsl:when test="$d2=26"><XDT_WW12><xsl:value-of select="ss:Cell[16]/ss:Data"/></XDT_WW12></xsl:when>
<xsl:when test="$d2=27"><XDT_WW13><xsl:value-of select="ss:Cell[16]/ss:Data"/></XDT_WW13></xsl:when>
<xsl:when test="$d2=28"><XDT_WW14><xsl:value-of select="ss:Cell[16]/ss:Data"/></XDT_WW14></xsl:when>
<xsl:when test="$d2=29"><XDT_WW15><xsl:value-of select="ss:Cell[16]/ss:Data"/></XDT_WW15></xsl:when>
<xsl:when test="$d2=30"><XDT_WW16><xsl:value-of select="ss:Cell[16]/ss:Data"/></XDT_WW16></xsl:when>
<xsl:when test="$d2=31"><XDT_WW17><xsl:value-of select="ss:Cell[16]/ss:Data"/></XDT_WW17></xsl:when>
<xsl:when test="$d2=32"><XDT_WW18><xsl:value-of select="ss:Cell[16]/ss:Data"/></XDT_WW18></xsl:when>
<xsl:when test="$d2=33"><XDT_WW19><xsl:value-of select="ss:Cell[16]/ss:Data"/></XDT_WW19></xsl:when>
<xsl:when test="$d2=34"><XDT_WW20><xsl:value-of select="ss:Cell[16]/ss:Data"/></XDT_WW20></xsl:when>
<xsl:when test="$d2=35"><XDT_WW21><xsl:value-of select="ss:Cell[16]/ss:Data"/></XDT_WW21></xsl:when>
<xsl:when test="$d2=36"><XDT_WW22><xsl:value-of select="ss:Cell[16]/ss:Data"/></XDT_WW22></xsl:when>
<xsl:when test="$d2=37"><XDT_WW23><xsl:value-of select="ss:Cell[16]/ss:Data"/></XDT_WW23></xsl:when>
<xsl:when test="$d2=38"><XDT_WW24><xsl:value-of select="ss:Cell[16]/ss:Data"/></XDT_WW24></xsl:when>
<xsl:when test="$d2=39"><XDT_WW25><xsl:value-of select="ss:Cell[16]/ss:Data"/></XDT_WW25></xsl:when>
<xsl:when test="$d2=40"><XDT_WW26><xsl:value-of select="ss:Cell[16]/ss:Data"/></XDT_WW26></xsl:when>
<xsl:when test="$d2=41"><XDT_WW27><xsl:value-of select="ss:Cell[16]/ss:Data"/></XDT_WW27></xsl:when>
<xsl:when test="$d2=42"><XDT_WW28><xsl:value-of select="ss:Cell[16]/ss:Data"/></XDT_WW28></xsl:when>
<xsl:when test="$d2=43"><XDT_WW29><xsl:value-of select="ss:Cell[16]/ss:Data"/></XDT_WW29></xsl:when>
<xsl:when test="$d2=44"><XDT_WW30><xsl:value-of select="ss:Cell[16]/ss:Data"/></XDT_WW30></xsl:when>
<xsl:when test="$d2=45"><XDT_WW31><xsl:value-of select="ss:Cell[16]/ss:Data"/></XDT_WW31></xsl:when>
<xsl:when test="$d2=46"><XDT_WW32><xsl:value-of select="ss:Cell[16]/ss:Data"/></XDT_WW32></xsl:when>
<xsl:when test="$d2=47"><XDT_WW33><xsl:value-of select="ss:Cell[16]/ss:Data"/></XDT_WW33></xsl:when>
<xsl:otherwise><XDT_WW2><xsl:value-of select="ss:Cell[16]/ss:Data"/></XDT_WW2></xsl:otherwise>
</xsl:choose>
</xsl:variable>
...
<xsl:variable name="e">
<xsl:value-of select="ss:Cell[28]/ss:index"/>
<xsl:choose>
<xsl:when test="$e=29"><XDT_WW15><xsl:value-of select="ss:Cell[28]/ss:Data"/></XDT_WW15></xsl:when>
<xsl:when test="$e=30"><XDT_WW16><xsl:value-of select="ss:Cell[28]/ss:Data"/></XDT_WW16></xsl:when>
<xsl:when test="$e=31"><XDT_WW17><xsl:value-of select="ss:Cell[28]/ss:Data"/></XDT_WW17></xsl:when>
<xsl:when test="$e=32"><XDT_WW18><xsl:value-of select="ss:Cell[28]/ss:Data"/></XDT_WW18></xsl:when>
<xsl:when test="$e=33"><XDT_WW19><xsl:value-of select="ss:Cell[28]/ss:Data"/></XDT_WW19></xsl:when>
<xsl:when test="$e=34"><XDT_WW20><xsl:value-of select="ss:Cell[28]/ss:Data"/></XDT_WW20></xsl:when>
<xsl:when test="$e=35"><XDT_WW21><xsl:value-of select="ss:Cell[28]/ss:Data"/></XDT_WW21></xsl:when>
<xsl:when test="$e=36"><XDT_WW22><xsl:value-of select="ss:Cell[28]/ss:Data"/></XDT_WW22></xsl:when>
<xsl:when test="$e=37"><XDT_WW23><xsl:value-of select="ss:Cell[28]/ss:Data"/></XDT_WW23></xsl:when>
<xsl:when test="$e=38"><XDT_WW24><xsl:value-of select="ss:Cell[28]/ss:Data"/></XDT_WW24></xsl:when>
<xsl:when test="$e=39"><XDT_WW25><xsl:value-of select="ss:Cell[28]/ss:Data"/></XDT_WW25></xsl:when>
<xsl:when test="$e=40"><XDT_WW26><xsl:value-of select="ss:Cell[28]/ss:Data"/></XDT_WW26></xsl:when>
<xsl:when test="$e=41"><XDT_WW27><xsl:value-of select="ss:Cell[28]/ss:Data"/></XDT_WW27></xsl:when>
<xsl:when test="$e=42"><XDT_WW28><xsl:value-of select="ss:Cell[28]/ss:Data"/></XDT_WW28></xsl:when>
<xsl:when test="$e=43"><XDT_WW29><xsl:value-of select="ss:Cell[28]/ss:Data"/></XDT_WW29></xsl:when>
<xsl:when test="$e=44"><XDT_WW30><xsl:value-of select="ss:Cell[28]/ss:Data"/></XDT_WW30></xsl:when>
<xsl:when test="$e=45"><XDT_WW31><xsl:value-of select="ss:Cell[28]/ss:Data"/></XDT_WW31></xsl:when>
<xsl:when test="$e=46"><XDT_WW32><xsl:value-of select="ss:Cell[28]/ss:Data"/></XDT_WW32></xsl:when>
<xsl:when test="$e=47"><XDT_WW33><xsl:value-of select="ss:Cell[28]/ss:Data"/></XDT_WW33></xsl:when>
<xsl:otherwise><XDT_WW14><xsl:value-of select="ss:Cell[28]/ss:Data"/></XDT_WW14></xsl:otherwise>
</xsl:choose>
</xsl:variable>
代码逻辑重复了很多次,总共有20多个变量。 任何帮助将受到高度赞赏。
以下是XML文件的摘录:
<?xml version="1.0"?> <?mso-application progid="Excel.Sheet"?><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"> <LastAuthor>APS_OWNER</LastAuthor> <Created>2013-03-05T07:03:29</Created> <Version>11.6408</Version> </DocumentProperties> <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"> <WindowHeight>8445</WindowHeight> <WindowWidth>11115</WindowWidth> <WindowTopX>720</WindowTopX> <WindowTopY>375</WindowTopY> <RefModeR1C1/> <ProtectStructure>False</ProtectStructure> <ProtectWindows>False</ProtectWindows> </ExcelWorkbook>
<Styles>
<Style ss:ID="Default" ss:Name="Normal"> <Alignment ss:Vertical="Bottom"/> <Borders/> <Font/> <Interior/> <NumberFormat/> <Protection/> </Style>
<Style ss:ID="ColumnHeader"> <Alignment ss:Vertical="Bottom" ss:Horizontal="Center"/> <Font ss:FontName="Times New Roman" x:Family="Roman" ss:Size="10" ss:Bold="1" ss:Underline="Single"/> <Interior/> <NumberFormat/> </Style>
<Style ss:ID="ColumnHeaderDate"> <Alignment ss:Vertical="Bottom" ss:Horizontal="Center"/> <Font ss:Size="10" ss:Bold="1" ss:Underline="Single"/> <Interior/> <NumberFormat ss:Format="[ENG][$-409]dd\-mmm\-yy;@"/> </Style>
<Style ss:ID="NumberStyleBlueCell"> <Alignment ss:Horizontal="Right"/> <Font/> <Interior ss:Color="Cyan" ss:Pattern="Solid"/> <NumberFormat ss:Format="###,###,###.00"/> </Style>
<Style ss:ID="TextStyleBlueCell"> <Alignment/> <Font/> <Interior ss:Color="Cyan" ss:Pattern="Solid"/> <NumberFormat/> </Style>
<Style ss:ID="NumberStyle"> <Alignment ss:Horizontal="Right"/> <Font/> <Interior/> <NumberFormat ss:Format="#,##0"/> </Style>
<Style ss:ID="NumberStyle2"> <Alignment ss:Horizontal="Right"/> <Font/> <Interior/> <NumberFormat ss:Format="####"/> </Style>
<Style ss:ID="DateStyle"> <Alignment/> <Font/> <Interior/> <NumberFormat ss:Format="[ENG][$-409]dd\-mmm\-yy;@"/> </Style>
<Style ss:ID="ColumnSum"> <Alignment ss:Horizontal="Right"/> <Font ss:Color="Blue"/> <Interior/>
<NumberFormat ss:Format="###,###,###.00"/> </Style>
<Style ss:ID="RowSum"> <Alignment ss:Horizontal="Right"/> <Font ss:Color="Red"/> <Interior/>
<NumberFormat ss:Format="###,###,###.00"/> </Style>
</Styles>
<Worksheet ss:Name="NO_Details_Across">
<Table ss:ExpandedColumnCount="47" ss:ExpandedRowCount="9978" x:FullColumns="1" x:FullRows="1">
<Row>
<Cell><Data ss:Type="String">NO</Data></Cell>
<Cell ss:StyleID="DateStyle"><Data ss:Type="DateTime">2013-03-05T07:03:28</Data></Cell>
<Cell><Data ss:Type="String">NO</Data></Cell>
<Cell><Data ss:Type="String">CNG</Data></Cell>
<Cell><Data ss:Type="String">CNG</Data></Cell>
<Cell><Data ss:Type="String">SAD</Data></Cell>
<Cell><Data ss:Type="String">S039</Data></Cell>
<Cell><Data ss:Type="String">CP4-XS</Data></Cell>
<Cell><Data ss:Type="String">3SK263-5-TG-E</Data></Cell>
<Cell><Data ss:Type="String">3SK263-E-5-ASY</Data></Cell>
<Cell><Data ss:Type="String">3SK263-E-5-WDQ</Data></Cell>
<Cell><Data ss:Type="String">NO PNX</Data></Cell>
<Cell ss:StyleID="NumberStyle"><Data ss:Type="Number">0</Data></Cell>
<Cell ss:StyleID="NumberStyle"><Data ss:Type="Number">468149</Data></Cell>
<Cell ss:Index="16" ss:StyleID="NumberStyle"><Data ss:Type="Number">23280</Data></Cell>
<Cell ss:Index="17" ss:StyleID="NumberStyle"><Data ss:Type="Number">23280</Data></Cell>
<Cell ss:Index="18" ss:StyleID="NumberStyle"><Data ss:Type="Number">23280</Data></Cell>
<Cell ss:Index="19" ss:StyleID="NumberStyle"><Data ss:Type="Number">46560</Data></Cell>
<Cell ss:Index="20" ss:StyleID="NumberStyle"><Data ss:Type="Number">46560</Data></Cell>
<Cell ss:Index="25" ss:StyleID="NumberStyle"><Data ss:Type="Number">69840</Data></Cell>
<Cell ss:Index="26" ss:StyleID="NumberStyle"><Data ss:Type="Number">93120</Data></Cell>
<Cell ss:Index="27" ss:StyleID="NumberStyle"><Data ss:Type="Number">69840</Data></Cell>
<Cell ss:Index="28" ss:StyleID="NumberStyle"><Data ss:Type="Number">93120</Data></Cell>
<Cell ss:Index="29" ss:StyleID="NumberStyle"><Data ss:Type="Number">116400</Data> </Cell>
<Cell ss:Index="30" ss:StyleID="NumberStyle"><Data ss:Type="Number">116400</Data></Cell>
<Cell ss:Index="31" ss:StyleID="NumberStyle"><Data ss:Type="Number">116400</Data> </Cell>
<Cell ss:Index="32" ss:StyleID="NumberStyle"><Data ss:Type="Number">116399</Data></Cell>
<Cell ss:Index="33" ss:StyleID="NumberStyle"><Data ss:Type="Number">139679</Data></Cell>
<Cell ss:Index="34" ss:StyleID="NumberStyle"><Data ss:Type="Number">116399</Data></Cell>
<Cell ss:Index="35" ss:StyleID="NumberStyle"><Data ss:Type="Number">139680</Data></Cell>
<Cell ss:Index="37" ss:StyleID="NumberStyle"><Data ss:Type="Number">93120</Data></Cell>
<Cell ss:Index="38" ss:StyleID="NumberStyle"><Data ss:Type="Number">116400</Data></Cell>
<Cell ss:Index="39" ss:StyleID="NumberStyle"><Data ss:Type="Number">93120</Data></Cell>
<Cell ss:Index="40" ss:StyleID="NumberStyle"><Data ss:Type="Number">93120</Data></Cell>
<Cell ss:Index="41" ss:StyleID="NumberStyle"><Data ss:Type="Number">116400</Data></Cell>
<Cell ss:Index="44" ss:StyleID="NumberStyle"><Data ss:Type="Number">69840</Data></Cell>
<Cell ss:Index="45" ss:StyleID="NumberStyle"><Data ss:Type="Number">419040</Data></Cell>
</Row>
</Table>
</Worksheet>
</Workbook>
答案 0 :(得分:0)
您似乎正在尝试匹配 ss:Index 元素,其中 ss:Index 属性位于特定范围内。所以你首先要有一个匹配这些
的模板<xsl:template match="ss:Cell[@ss:Index > position()][not(@ss:Index > 47)]">
(请注意 ss:Index 是一个属性,因此您使用@符号来访问它)
然后你可以创建元素,并根据索引命名它,就像这样(注意在这里使用属性值模板来创建元素名称。花括号表示它是一个要评估的表达式,而不是输出字面意思)
<xsl:element name="{concat('XDT_WW', @ss:Index - 14)}">
<xsl:value-of select="ss:Data" />
</xsl:element>
如果单元格的索引不在范围内,您将拥有另一个匹配这些
的模板<xsl:template match="ss:Cell">
<XDT_WW1>
<xsl:value-of select="ss:Data" />
</XDT_WW1>
</xsl:template>
然后你会像这样调用模板
<xsl:apply-templates select="//ss:Cell[15]" />
<xsl:apply-templates select="//ss:Cell[16]" />
<xsl:apply-templates select="//ss:Cell[17]" />
XSLT将始终首先匹配更具体的模板(即索引在范围内的模板)。
实际上,为了避免重复代码,您可以将一个模板设为命名模板,并使用带有新元素编号的参数调用它。试试这个XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:apply-templates select="//ss:Cell[15]" />
<xsl:apply-templates select="//ss:Cell[16]" />
<xsl:apply-templates select="//ss:Cell[17]" />
</xsl:template>
<xsl:template match="ss:Cell[@ss:Index > position()][not(@ss:Index > 47)]">
<xsl:call-template name="cell">
<xsl:with-param name="elementNumber" select="number(@ss:Index) - 14" />
</xsl:call-template>
</xsl:template>
<xsl:template match="ss:Cell" name="cell">
<xsl:param name="elementNumber" select="1" />
<xsl:element name="{concat('XDT_WW', $elementNumber)}">
<xsl:value-of select="ss:Data" />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
应用于XML时,输出以下内容
<XDT_WW2>23280</XDT_WW2>
<XDT_WW3>23280</XDT_WW3>
<XDT_WW4>23280</XDT_WW4>