XML XSLT显示同一组中的相关信息

时间:2012-01-24 15:28:06

标签: xml xslt

我有一个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)。 我将不胜感激任何帮助。谢谢!

3 个答案:

答案 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>&#xA0;</xsl:text>
        <xsl:value-of select="following-sibling::level2[1]"/>
        <xsl:text>&#xA0;</xsl:text>
        <xsl:apply-templates select="key('k', .)/following-sibling::level3[1]"/>
        <xsl:text>&#xA;</xsl:text>
    </xsl:template>

    <xsl:template match="level3">
        <xsl:value-of select="."/>
        <xsl:text>&#xA0;</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