различные значения xslt с использованием переопределения параметра или массива - PullRequest
1 голос
/ 02 марта 2012

Мой xml выглядит следующим образом:

<topics>
   <topic name="topic1" />
 <topic name="topic2" />
 <topic name="topic3" />
 <topic name="topic4" />
 <topic name="topic5" />
 <topic name="topic6" /> 
<topic name="topic7" />
</topics>
<supertopics>
  <supertopic title="supertopic1" name="1;topic1;#2;#topic2;3;#topic3" />
  <supertopic title="supertopic2" name="4;#topic4;#7;#topic7" />
    <supertopic title="supertopic3" name="2;#topic2;#3;#topic3" />
  <supertopic title="supertopic4" name="5;#topic5;#7;#topic7" />
  <supertopic title="supertopic5" name="3;#topic3;#7;#topic7" />
  <supertopic title="supertopic6" name="4;#topic4;#7;#topic7" />
  <supertopic title="supertopic7" name="5;#topic5;#7;#topic7" />
  <supertopic title="supertopic8" name="2;#topic2;#6;#topic6" />
  <supertopic title="supertopic9" name="5;#topic6;#7;#topic7" />
  <supertopic title="supertopic10" name="3;#topic3;#4;#topic4" />
</supertopics>

Я в основном хочу по 1 супертопу на тему. Это значит, что у меня есть 7 тем и я хочу, чтобы с ними было связано 7 самых последних супертоп.У меня также есть своя дата, я делаю сортировку, но главное, я хочу, чтобы эти 7 супертопов были уникальными, так как в каждой теме есть несколько супертоп.

Поэтому я хочу, чтобы мой вывод был таким:

supertopic1 (topic1 is associated to supertopic1)
supertopic3 (topic2 is associated to supertopic1 but as its already there i want it to look for next supertopic its associated to)
supertopic5 (topic3)
supertopic2 (topic4)
supertopic4 (topic5)
supertopic8 (topic6)
supertopic6 (topic7)

Я использую xsl 1.0

, и я пытался добиться этого, используя, но я не мог найти способ сделать это:

<xsl:param name="FilteredAssets1">
 <stopic></stopic>
  <ttopic></ttopic>
</xsl:param>
    <xsl:for-each select="topics/topic/@name">
            <xsl:variable name="topicname">
                <xsl:value-of select="."></xsl:value-of>
            </xsl:variable>
   <xsl:for-each select="/supertopics/supertopic[contains(@name,$topicname)]">
             <xsl:if test="not(contains(msxsl:node-set($FilteredAssets1)/stopic,@title)) and not(contains(msxsl:node-set($FilteredAssets1)/ttopic,$programname))">
        <stopic><xsl:value-of select="@title"></xsl:value-of></stopic>
        <ttopic><xsl:value-of select="$programname"></xsl:value-of></ttopic>

            </xsl:if>
            </xsl:for-each>         
         </xsl:for-each>  

1 Ответ

0 голосов
/ 02 марта 2012

Это преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:variable name="vSupers"
      select="/*/supertopics/supertopic"/>

 <xsl:template match="/*">
  <xsl:apply-templates select="topics/topic[1]"/>
 </xsl:template>

 <xsl:template match="topic">
   <xsl:param name="pUsedSupers" select="/.."/>

   <xsl:variable name="vNewSuper" select=
   "$vSupers
       [not(@title = $pUsedSupers/@title)
      and
        contains(concat(@name, ';'),
                 concat('#', current()/@name, ';')
                )
       ]
        [1]
   "/>

   <xsl:value-of select="concat('&#xA;', $vNewSuper/@title)"/>

   <xsl:apply-templates select="following-sibling::topic[1]">
    <xsl:with-param name="pUsedSupers"
     select="$pUsedSupers | $vNewSuper"/>
   </xsl:apply-templates>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному XML-тексту (обернутым одним верхним элементом для создания правильно оформленного XML-документа, а также с учетом того, что я считаю опечаткой для supertopic1):

<t>
    <topics>
        <topic name="topic1" />
        <topic name="topic2" />
        <topic name="topic3" />
        <topic name="topic4" />
        <topic name="topic5" />
        <topic name="topic6" />
        <topic name="topic7" />
    </topics>
    <supertopics>
        <supertopic title="supertopic1" name="1;#topic1;#2;#topic2;3;#topic3" />
        <supertopic title="supertopic2" name="4;#topic4;#7;#topic7" />
        <supertopic title="supertopic3" name="2;#topic2;#3;#topic3" />
        <supertopic title="supertopic4" name="5;#topic5;#7;#topic7" />
        <supertopic title="supertopic5" name="3;#topic3;#7;#topic7" />
        <supertopic title="supertopic6" name="4;#topic4;#7;#topic7" />
        <supertopic title="supertopic7" name="5;#topic5;#7;#topic7" />
        <supertopic title="supertopic8" name="2;#topic2;#6;#topic6" />
        <supertopic title="supertopic9" name="5;#topic6;#7;#topic7" />
        <supertopic title="supertopic10" name="3;#topic3;#4;#topic4" />
    </supertopics>
</t>

дает желаемый, правильный результат :

supertopic1
supertopic3
supertopic5
supertopic2
supertopic4
supertopic8
supertopic6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...