-2

作为 XML 和 XSLT 的新手,我已经为我的需求生成了一个代码。但是,我想使用 XSL:template 来简化我的 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>
4

1 回答 1

0

看起来您正在尝试匹配ss :Index属性在特定范围内的ss:Cell元素。所以你会从有一个模板来匹配这些

<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>
于 2013-04-04T07:49:05.277 回答