我有一个XML文件,我需要使用XSLT进行转换。这是我的XML示例:
<level1>COLORS</level1>
<level2>COLOR</level2>
<level3>RED</level3>
<level1>COLORS</level1>
<level2>COLOR</level2>
<level3>YELLOW</level3>
<level1>FLAVORS</level1>
<level2>FLAVOR</level2>
<level3>SWEET</level3>
<level1>FLAVORS</level1>
<level2>FLAVOR</level2>
<level3>SOUR</level3>
要求输出为:
COLORS COLOR RED YELLOW
FLAVORS FLAVOR SWEET SOUR
我需要在Sharepoint 2007中执行此操作。我一直在研究如何使用previous-sibling,follow-sibling,for-each-group等来完成此操作,但由于缺乏而无法解决这个问题。接触这些技术或因为Sharepoint不允许它(SP只知道XSL v.1而不是v.2)。 我将不胜感激任何帮助。谢谢!
答案 0 :(得分:2)
这个简单的转换(只有一个键,只有一个模板):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:key name="kValues" match="*/*" use="."/>
<xsl:template match=
"*/*[generate-id()
=
generate-id(key('kValues', .)[1])
]">
<xsl:value-of select="concat(., ' ')"/>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
应用于提供的XML文档:
<t>
<level1>COLORS</level1>
<level2>COLOR</level2>
<level3>RED</level3>
<level1>COLORS</level1>
<level2>COLOR</level2>
<level3>YELLOW</level3>
<level1>FLAVORS</level1>
<level2>FLAVOR</level2>
<level3>SWEET</level3>
<level1>FLAVORS</level1>
<level2>FLAVOR</level2>
<level3>SOUR</level3>
</t>
生成想要的正确结果:
COLORS COLOR RED YELLOW FLAVORS FLAVOR SWEET SOUR
解释:正确使用 Muenchian grouping method 。
答案 1 :(得分:1)
使用:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" indent="yes" />
<xsl:key name="k" match="level1" use="."/>
<xsl:template match="/root">
<xsl:apply-templates select="level1[generate-id(.) = generate-id(key('k', .))]"/>
</xsl:template>
<xsl:template match="level1">
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
<xsl:value-of select="following-sibling::level2[1]"/>
<xsl:text> </xsl:text>
<xsl:apply-templates select="key('k', .)/following-sibling::level3[1]"/>
<xsl:text>
</xsl:text>
</xsl:template>
<xsl:template match="level3">
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
</xsl:template>
</xsl:stylesheet>
输入:
<root>
<level1>COLORS</level1>
<level2>COLOR</level2>
<level3>RED</level3>
<level1>COLORS</level1>
<level2>COLOR</level2>
<level3>YELLOW</level3>
<level1>FLAVORS</level1>
<level2>FLAVOR</level2>
<level3>SWEET</level3>
<level1>FLAVORS</level1>
<level2>FLAVOR</level2>
<level3>SOUR</level3>
</root>
输出:
COLORS COLOR RED YELLOW
FLAVORS FLAVOR SWEET SOUR
答案 2 :(得分:1)
使用下面格式的示例
<?xml version="1.0" encoding="utf-8"?>
<root>
<level1>COLORS</level1>
<level2>COLOR</level2>
<level3>RED</level3>
<level1>COLORS</level1>
<level2>COLOR</level2>
<level3>YELLOW</level3>
<level1>FLAVORS</level1>
<level2>FLAVOR</level2>
<level3>SWEET</level3>
<level1>FLAVORS</level1>
<level2>FLAVOR</level2>
<level3>SOUR</level3>
</root>
用这个
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
<xsl:output method="xml" indent="yes"/>
<xsl:key name="k1" match="level1" use="."/>
<xsl:key name="k2" match="level2" use="."/>
<xsl:key name="k3" match="level3" use="."/>
<xsl:template match="root">
<xsl:apply-templates select="level1[generate-id() = generate-id(key('k1', .)[1])]"/>
</xsl:template>
<xsl:template match="level1">
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
<xsl:apply-templates select="../level2[generate-id() = generate-id(key('k2', .)[1])][preceding-sibling::level1[1]=current()]"/>
</xsl:template>
<xsl:template match="level2">
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
<xsl:apply-templates select="../level3[generate-id() = generate-id(key('k3', .)[1])][preceding-sibling::level2[1]=current()]"/>
</xsl:template>
<xsl:template match="level3">
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
</xsl:template>
</xsl:stylesheet>
产生正确的结果 颜色颜色红色黄色味道风味甜点SOUR