在xslt 1.0中分组

时间:2011-02-28 13:25:01

标签: xslt-1.0

我需要在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 个答案:

答案 0 :(得分:1)

编辑:抱歉,我现在看到我误解了你的问题。我相信以下内容或多或少是您正在寻找的内容:

<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>

那应该创建一个&lt; plant&gt; {em> plantcode , airportofloading airportofunloading }的每三倍的元素。所述&lt;植物&gt;包含所有&lt; SO&gt;的元素这个三重奏的元素。我相信这是你想要的,或者非常接近它,所以你应该能够进行任何必要的调整。