我想从文件数据库中分组记录。我使用XSLT进行转换的选项导出为XML。如何按XSLT中的节点值对XML元素进行分组?
我一直在做一些搜索和阅读其他职位,我不认为他们完全覆盖我想要做的事情。
的XML的摘录:
<?xml version="1.0" encoding="UTF-8"?>
<!-- This grammar has been deprecated - use FMPXMLRESULT instead -->
<FMPDSORESULT xmlns="http://www.filemaker.com/fmpdsoresult">
<ERRORCODE>0</ERRORCODE>
<DATABASE>Artpostersnbbs.fp7</DATABASE>
<LAYOUT />
<ROW MODID="19" RECORDID="11116">
<Art_Type>Poster</Art_Type>
<Location>1</Location>
<Line1>ELEVATOR
MACHINE
ROOM
107</Line1>
</ROW>
<ROW MODID="19" RECORDID="11116">
<Art_Type>Poster</Art_Type>
<Location>2</Location>
<Line1>ELEVATOR
MACHINE
ROOM
107</Line1>
</ROW>
<ROW MODID="19" RECORDID="11116">
<Art_Type>Poster</Art_Type>
<Location>3</Location>
<Line1>ELEVATOR
MACHINE
ROOM
107</Line1>
</ROW>
</FMPDSORESULT>
我想这个组的每两个ART_TYPE和LINE-一致的记录。被分组应该从比赛添加位置到后一个被分成所以它应该是这样的:
<ROW MODID="19" RECORDID="11116">
<Art_Type>Poster</Art_Type>
<Location>1 2 3</Location>
<Line1>ELEVATOR
MACHINE
ROOM
107
</Line1>
</ROW>
关于如何开始将不胜感激任何帮助。还有什么好的xslt 1.0测试程序?
在此先感谢!
编辑:我指着Muenchian分组的,发现这个网站:http://www.jenitennison.com/xslt/grouping/muenchian.html
所以从阅读,我想出了:
<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="artTypeNames" match="ROW" use="Art_Type" />
<xsl:key name="artCopy" match="ROW" use="Line1" />
<xsl:template match="FMPDSORESULT">
<xsl:for-each select="ROW[count(. | key('artTypeNames', Art_Type)[1]) = 1]">
<xsl:sort select="Art_Type" />
<xsl:value-of select="Art_Type" />
<xsl:for-each select="key('artTypeNames', Art_Type)">
<xsl:sort select="Art_Type" />
<xsl:value-of select="Art_Type" />
</xsl:for-each>
</xsl:for-each>
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
我进入了XML和XSLT到在线XML转换器我得到'XSLT无效'错误。
这令人沮丧。
EDIT2:随着Tim的帮助,我是能够建立一个适当的XSLT转换:
<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fm="http://www.filemaker.com/fmpdsoresult">
<xsl:template match="fm:FMPDSORESULT">
<xsl:apply-templates select="fm:ROW[count(. | key('lineData', fm:Line1)[1]) = 1]">
</xsl:apply-templates>
</xsl:template>
<xsl:template match="fm:ROW">
<xsl:copy>
<xsl:apply-templates select="fm:Art_Type" />
<fm:Location>
<xsl:apply-templates select="key('artTypeNames', fm:Art_Type)/fm:Location" />
</fm:Location>
<xsl:apply-templates select="fm:Line1" />
</xsl:copy>
</xsl:template>
<xsl:template match="fm:Location">
<xsl:if test="position() > 1">-</xsl:if>
<xsl:value-of select="." />
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
这组Art_Type然后由Line1文本,但现在添加了位置编号像这样:
<ROW xmlns="http://www.filemaker.com/fmpdsoresult">
<Art_Type>Poster</Art_Type>
<fm:Location xmlns:fm="http://www.filemaker.com/fmpdsoresult" xmlns="">1-2-3-4-5-6-7-8-9-10-11-12-13-14-15-16-17-18-19-20-21-22-23-24-25-26-27-28-29-30-31-32-33-34</fm:Location>
<Line1>CUSTODIAL
LOUNGE
117A
</Line1>
</ROW>
<ROW xmlns="http://www.filemaker.com/fmpdsoresult">
<Art_Type>Poster</Art_Type>
<fm:Location xmlns:fm="http://www.filemaker.com/fmpdsoresult" xmlns="">1-2-3-4-5-6-7-8-9-10-11-12-13-14-15-16-17-18-19-20-21-22-23-24-25-26-27-28-29-30-31-32-33-34</fm:Location>
<Line1>STORAGE
ROOM
117B
</Line1>
</ROW>
如果Line1文本不同,它应该将其添加到另一个组中。
如果你正在寻找一个简单的XSLT在线工具你可以试试这个,http://xslttest.appspot.com/ – Hash
谢谢。它会派上用场,一旦我弄清楚如何使用xslt lol。 – clrx
您可能还想在XSLT中使用google“default namespace”。 –