XML XSLT Показать связанную информацию в той же группе - PullRequest
3 голосов
/ 24 января 2012

У меня есть 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. Я изучал, как это сделать с предшествующими братьями и сестрами, после братьев и сестер, для каждой группы и т. Д., Но не смог решить это из-за отсутствия ознакомление с этими технологиями или потому что Sharepoint не допустит этого (SP знает только XSL v.1, но не v.2). Буду признателен за любую помощь, которая предоставляется. Спасибо!

Ответы [ 3 ]

2 голосов
/ 24 января 2012

Это простое преобразование (только один ключ и только один шаблон) :

<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

Пояснение : надлежащее использование метода группировки мюнхенских .

1 голос
/ 24 января 2012

используя ваш пример в формате ниже

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

получены правильные результаты ЦВЕТА ЦВЕТА КРАСНЫЙ ЖЕЛТЫЙ АРОМАТ АРОМАТ СЛАДКИЙ ИСТОЧНИК

1 голос
/ 24 января 2012

Использование:

<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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...