У нас есть программное обеспечение, в которое мы получаем потоки данных XML, которые мы переводим в соответствии с нашим анализатором каналов. Я работаю над созданием нового фида, и мне сложно выделить одну из категорий из-за того, как поступает исходный фид. Я не могу изменить наш формат XML или их, поэтому я застрял с необходимость делать это только в XSL (T).
В этом теоретическом примере у меня есть список продуктов, которые будут отображаться в нескольких создаваемых каталогах. Мы относимся к товарам со 100% наценкой иначе, чем к товарам с 80% наценкой. Обычно мы получаем элементы с более высокой разметкой как отдельный продукт, но в этом случае он встраивается намного ниже в дерево узлов.
XML, который мы получаем, выглядит примерно так:
<?xml version="1.0" encoding="utf-8" ?>
<products>
<product>
<name>lawnmower</name>
<prices>
<price>
<supplier>amazon</supplier>
<markup>100%</markup>
<price>$200</price>
</price>
<price>
<supplier>newegg</supplier>
<markup>80%</markup>
<price>$160</price>
</price>
<price>
<supplier>home depot</supplier>
<markup>80%</markup>
<price>$150</price>
</price>
</prices>
</product>
<product>
<name>laptop</name>
<prices>
<price>
<supplier>newegg</supplier>
<markup>80%</markup>
<price>$1000</price>
</price>
</prices>
</product>
<product>
<name>my little pony</name>
<prices>
<price>
<supplier>amazon</supplier>
<markup>80%</markup>
<price>$50</price>
</price>
<price>
<supplier>newegg</supplier>
<markup>80%</markup>
<price>$40</price>
</price>
</prices>
</product>
</products>
И мы хотим преобразовать это так:
<?xml version="1.0" encoding="utf-8" ?>
<prodlist>
<products>
<product category="lawnmower">
<price supplier="newegg">$160</price>
<price supplier="home depot">$150</price>
</product>
<product category="lawnmower100">
<price supplier="amazon">$200</price>
</product>
<product category="laptop">
<price supplier="newegg">$1000</price>
</product>
<product category="my little pony">
<price supplier="amazon">$50</price>
</product>
</products>
</prodlist>
Я использую некоторый XSL, который выглядит примерно так (я вырезал весь окружающий XSL, чтобы попытаться немного краткости):
<xsl:template match="products">
<xsl:element name="product">
<xsl:choose>
<xsl:when test = "name = 'lawnmower' and prices/price/markup = '100%'">
<xsl:attribute name="category">lawnmower100</xsl:attribute>
<xsl:apply-templates select="prices" />
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="category">
<xsl:value-of select="name" />
</xsl:attribute>
<xsl:apply-templates select="prices" />
</xsl:otherwise>
</xsl:choose>
</xsl:element>
</xsl:template>
Использование этого дает мне некоторые плохие результаты; все для газонокосилок попадает в категорию «газонокосилка100», что дает мне результат, который выглядит следующим образом:
<?xml version="1.0" encoding="utf-8" ?>
<prodlist>
<products>
<product category="lawnmower100">
<price supplier="amazon">$200</price>
<price supplier="newegg">$160</price>
<price supplier="home depot">$150</price>
</product>
<product category="laptop">
<price supplier="newegg">$1000</price>
</product>
<product category="my little pony">
<price supplier="amazon">$50</price>
</product>
</products>
</prodlist>
Я не слишком уверен, как мне выбирать 100% размеченные элементы, но все, что я сейчас делаю, не работает. Я играл с и, но я не думаю, что я использую их правильно, так как я продолжаю в конечном итоге с этим результатом.
Надеюсь, я предоставил достаточно подробностей, чтобы это имело смысл!