группировка в xslt 1.0 - PullRequest
       7

группировка в xslt 1.0

0 голосов
/ 28 февраля 2011

Мне нужно решить проблему нащупывания в моем xsl;Я должен сгруппировать входной XML на основе и.Если какие-либо из этих данных не совпадают, то создайте новый тег и скопируйте в него соответствующий тег.Если вы проверите мой xslt, я могу выполнить группировку, но не уверен, как включить ту же логику для и.Я не уверен, если я объяснил проблему очень хорошо, но если вы увидите раздел «необходимый вывод», было бы легче понять, что я хочу.Заранее благодарим за помощь.

Ввод:

<?xml version="1.0" encoding="UTF-8"?>
<BC>
    <SO>
        <plantCode>xyz</plantCode>
        <airportofloading>US</airportofloading>
        <airportofunloading>UK</airportofunloading>
                  <package>1</package>
                  ....
    </SO>
    <SO>
        <plantCode>xyz</plantCode>
        <airportofloading>US</airportofloading>
        <airportofunloading>UK</airportofunloading>
                  <package>2</package>
                  ...
    </SO>
    <SO>
        <plantCode>abc</plantCode>
        <airportofloading>US</airportofloading>
        <airportofunloading>UK</airportofunloading>
                  <package>5</package>
                  ....
    </SO>
    <SO>
        <plantCode>abc</plantCode>
        <airportofloading>US</airportofloading>
        <airportofunloading>AB</airportofunloading>
                  <package>1</package>
                  ....
    </SO>
</BC>

Необходимый вывод:

<?xml version="1.0" encoding="UTF-8"?>
<BC>
    <plant name="xyz">
        <SO>
            <plantCode>xyz</plantCode>
            <airportofloading>US</airportofloading>
            <airportofunloading>UK</airportofunloading>
                            <package>1</package>
                            ....
        </SO>
        <SO>
            <plantCode>xyz</plantCode>
            <airportofloading>US</airportofloading>
            <airportofunloading>UK</airportofunloading>
                            <package>2</package>
                            ....
        </SO>
    </plant>
    <plant name="abc">
        <SO>
            <plantCode>abc</plantCode>
            <airportofloading>US</airportofloading>
            <airportofunloading>UK</airportofunloading>
                            <package>5</package>
                            ....

        </SO>
    </plant>
    <plant name="abc">
        <SO>
            <plantCode>abc</plantCode>
            <airportofloading>US</airportofloading>
            <airportofunloading>AB</airportofunloading>
                            <package>1</package>
                            ....

        </SO>
    </plant>
    </BC>

Мой XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"     xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:output method="xml"/>
    <xsl:key name="Code" match="SO" use="plantCode"/>
    <xsl:template match="BC">
        <xsl:element name="BC">
            <xsl:apply-templates select="SO[generate-id(.) = generate-id(key    ('Code', plantCode)[1])]"/>
            </xsl:element>
</xsl:template>
<xsl:template match="SO">
    <xsl:element name="plant">
        <xsl:attribute name="name"><xsl:value-of     select="plantCode"/></xsl:attribute>
            <xsl:for-each select="key('Code', plantCode)">
                <xsl:copy-of select="."/>
            </xsl:for-each>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

1 Ответ

1 голос
/ 28 февраля 2011

Редактировать: Извините, теперь я понял, что я неправильно понял ваш вопрос.Я верю, что следующее более или менее то, что вы ищете:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:key name="code" match="SO" use="plantCode" />
  <xsl:key name="airports" match="SO" use="concat(airportofloading,' ',airportofunloading)" />
  <xsl:output indent="yes"/>
  <xsl:template match="/">
        <xsl:apply-templates />
  </xsl:template>
  <xsl:template match="BC">
        <BC>
              <xsl:for-each select="SO[generate-id(.)=generate-id(key('code',plantCode))]">
                    <xsl:variable name="thisCode" select="plantCode"/>
                    <xsl:for-each select="../SO[generate-id() = generate-id(key('airports', concat(airportofloading,' ',airportofunloading))[plantCode = $thisCode][1])]">
                          <xsl:element name="plant">
                                <xsl:attribute name="name">
                                      <xsl:value-of select="plantCode"/>
                                </xsl:attribute>
                                <xsl:for-each select="key('airports', concat(airportofloading,' ',airportofunloading))[plantCode = $thisCode]">
                                      <xsl:copy-of select="."/>
                                </xsl:for-each>
                          </xsl:element>
                    </xsl:for-each>
              </xsl:for-each>
        </BC>
  </xsl:template>

Это должно создать один элемент для каждой тройки { код завода , аэропорт загрузки , аэропорт загрузки }.Упомянутый элемент содержит все элементы для этой тройки.Я считаю, что это то, что вы хотели, или очень близко к этому, поэтому вы должны иметь возможность вносить любые необходимые изменения.

...