XSL-преобразование на основе значений-потомков? - PullRequest
2 голосов
/ 25 февраля 2010

У нас есть программное обеспечение, в которое мы получаем потоки данных 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% размеченные элементы, но все, что я сейчас делаю, не работает. Я играл с и, но я не думаю, что я использую их правильно, так как я продолжаю в конечном итоге с этим результатом.

Надеюсь, я предоставил достаточно подробностей, чтобы это имело смысл!

1 Ответ

2 голосов
/ 25 февраля 2010

Если я не очень сильно ошибаюсь, это должно быть что-то вроде:

<xsl:template match="products">
  <xsl:apply-templates select="product[prices/price/markup='100%']" mode="hundred"/>
  <xsl:apply-templates select="product[prices/price/markup='80%']" mode="eighty"/>
</xsl:template>

<xsl:template match="product" mode="hundred">
  <xsl:element name="product">
    <xsl:attribute name="category"><xsl:value-of select="name" /></xsl:attribute>
    <xsl:apply-templates select="prices/price[markup='100%']"/>
  </xsl:element>
</xsl:template>

<xsl:template match="product" mode="eighty">
  <xsl:element name="product">
    <xsl:attribute name="category"><xsl:value-of select="concat(name,'80')" /></xsl:attribute>
    <xsl:apply-templates select="prices/price[markup='80%']"/>
  </xsl:element>
</xsl:template>

<xsl:template match="price">
  <!-- individual price processing here -->
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...