我需要在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>
答案 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;的元素这个三重奏的元素。我相信这是你想要的,或者非常接近它,所以你应该能够进行任何必要的调整。