У меня есть XML-файл, подобный этому:
<products>
<cars>
<car>
<brand>Audi</brand>
<type>S3</type>
<attribs>
<attrib>
<color>1</color>
<price>45000</price>
</attrib>
<attrib>
<color>2</color>
<price>75000</price>
</attrib>
<attrib>
<color>4</color>
<price>35000</price>
</attrib>
</attribs>
</car>
<!-- Many cars following -->
</cars>
<colors>
<color>
<id>1</id>
<shortdesc>Blue</shortdesc>
<description>Blue Lagoon</description>
</color>
<color>
<id>2</id>
<shortdesc>Red</shortdesc>
<description>Red Sport</description>
</color>
<color>
<id>3</id>
<shortdesc>Green</shortdesc>
<description>Green Forest</description>
</color>
<color>
<id>4</id>
<shortdesc>Yellow</shortdesc>
<description>Yellow</description>
</color>
<!-- many colors -->
</colors>
</products>
Я конвертирую этот XML в кросс-лист Excel, где у меня есть машины по вертикали и цвета по горизонтали, например:
Brand / Model 1/Blue 2/Red 3/Green 4/Yellow
Audi S3 45000 75000 - 35000
Audi S6 66000 68000 59000 -
Jaguar x-type 98000 - 99500 -
и xslt выглядит так:
<ss:Table>
<ss:Row>
<!-- This is the header row -->
<ss:Cell>
<ss:Data ss:Type="String">Brand / Model</ss:Data>
</ss:Cell>
<xsl:for-each select="colors/color">
<ss:Cell>
<ss:Data ss:Type="String">
<xsl:value-of select="id"/>/<xsl:value-of select="shortdesc"/>
</ss:Data>
</ss:Cell>
</xsl:for-each>
</ss:Row>
<xsl:for-each select="cars/car">
<ss:Row>
<ss:Cell>
<ss:Data ss:Type="String">
<xsl:value-of select="brand"/> <xsl:value-of select="type"/>
</ss:Data>
</ss:Cell>
<xsl:for-each select="attribs/attrib">
<!-- I Know this is incorrect, but what to put in the if ? -->
<xsl:if test="color = /colors/color/id">
<ss:Cell>
<ss:Data ss:Type="String">
<xsl:value-of select="price"/>
</ss:Data>
</ss:Cell>
</xsl:if>
<xsl:if test="color != /colors/color/id">
<ss:Cell>
<ss:Data ss:Type="String">-</ss:Data>
</ss:Cell>
</xsl:if>
</xsl:for-each>
</ss:Row>
</xsl:for-each>
</ss:Table>
Я ищу способ сравнить / записать цену в правом столбце.
Шаблон ссылается на узел / продукты, чтобы иметь доступ к автомобилям и цветам.
Возможный способ состоит в том, чтобы создать массив, в то время как я пишу цвета в заголовке и сравниваю его с обработкой автомобилей;
Это возможный путь или что-то лучшее возможно?
Еще одна деталь: я не могу изменить XML, так как он уже спроектирован таким образом (на самом деле я обрабатываю не автомобили, а просто, чтобы упростить его)