2 Stimmen

XSLT Conditional innerhalb von For-Each

Wie kann ich eine if-Anweisung in meine Schleifenbedingung in XSLT aufnehmen?

Ich habe 2 oder 3 verschiedene Szenarien, die die Daten definieren, die ich durchschleifen möchte. Zum Beispiel kann es eine Produkt-ID geben oder auch nicht. Wenn ja, möchte ich nur die Datensätze durchlaufen, die diese Produkt-ID enthalten, ansonsten möchte ich alle Datensätze. Ich habe versucht, etwas Ähnliches zu tun:

<xsl:variable name="knowledgebaseLoop">
      <xsl:choose>
        <xsl:when test="string-length($productId) &gt; 0">
          <xsl:copy-of select="$currentPage/child::* [ID = $parentId]"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:copy-of select="$currentPage/child::* [ID = $parentId]"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:variable>

<xsl:for-each select="knowledgebaseLoop">
      <xsl:if test="position() &gt; $recordsPerPage * number($pageNumber - 1) and position() &lt;= number($recordsPerPage * number($pageNumber - 1) + $recordsPerPage )">
        <div id="main_body_listing">
          <div class="listing_title2"><a href="{umbraco.library:NiceUrl(current()/@id)}"><xsl:value-of select="current()/@nodeName"/></a></div>
          <xsl:value-of select="current()/summary"/>
        </div>
      </xsl:if>
    </xsl:for-each>

Aber es ist nicht in der Lage, die XSLT zu parsen. Ich weiß, die 2 Bedingungen sind die gleichen, ich war im Begriff, eine neu zu schreiben, sobald ich es funktioniert. Vielen Dank im Voraus für jede Hilfe!

UPDATE:

Hier ist ein XML-Beispiel:

<Knowledgebase id="1073" parentID="-1" level="1" writerID="0" creatorID="0" nodeType="1062" template="1083" sortOrder="5" createDate="2011-04-20T13:43:41" updateDate="2011-05-11T14:34:23" nodeName="Knowledgebase" urlName="knowledgebase" writerName="Chris" creatorName="Chris" path="-1,1073" isDoc=""><pageTitle>Knowledgebase</pageTitle><metaDescription>knowledgebase</metaDescription><metaKeywords>knowledgebase</metaKeywords><umbracoUrlName /><Article id="1074" parentID="1073" level="2" writerID="0" creatorID="0" nodeType="1063" template="1084" sortOrder="1" createDate="2011-04-20T13:44:13" updateDate="2011-05-16T09:39:12" nodeName="What is the answer to this question?" urlName="what-is-the-answer-to-this-question" writerName="Chris" creatorName="Chris" path="-1,1073,1074" isDoc=""><title>Change 2 Test 2</title><summary>Change 2 Test 2</summary><description>

&lt;p&gt;&lt;strong&gt;Change 2 Test 2&lt;br /&gt;
&lt;/strong&gt;&lt;/p&gt;
</description><relatedProducts>1071,1076</relatedProducts><pageTitle>asd</pageTitle><metaDescription>asd</metaDescription><metaKeywords>asd</metaKeywords><umbracoUrlName /></Article><Article id="1082" parentID="1073" level="2" writerID="0" creatorID="3" nodeType="1063" template="1084" sortOrder="2" createDate="2011-05-04T09:59:31" updateDate="2011-05-11T14:34:23" nodeName="Question 2" urlName="question-2" writerName="Chris" creatorName="Content Writer" path="-1,1073,1082" isDoc=""><title>test</title><summary>test 22</summary><description>
&lt;p&gt;tst&lt;/p&gt;

</description><relatedProducts>1075</relatedProducts><pageTitle /><metaDescription></metaDescription><metaKeywords></metaKeywords><umbracoUrlName /></Article><Article id="1146" parentID="1073" level="2" writerID="4" creatorID="3" nodeType="1063" template="1084" sortOrder="3" createDate="2011-05-13T15:36:14" updateDate="2011-05-13T15:37:21" nodeName="Question 3" urlName="question-3" writerName="Content Approver" creatorName="Content Writer" path="-1,1073,1146" isDoc=""><title>Test</title><summary></summary><description>
&lt;p&gt;Test&lt;/p&gt;
</description><relatedProducts /><pageTitle>Test</pageTitle><metaDescription>test</metaDescription><metaKeywords>test</metaKeywords><umbracoUrlName /></Article></Knowledgebase>

Ich brauche immer die Artikel, bei denen die übergeordnete ID 1073 ist. Wenn und nur wenn eine Produkt-ID existiert, möchte ich die Artikel, bei denen die Produkt-ID in der Liste der verwandten Produkte steht. Nochmals vielen Dank!

3voto

Dimitre Novatchev Punkte 234995

Zum Beispiel kann oder muss es Produkt-ID. Wenn es eine gibt, möchte ich nur die Datensätze durchlaufen, die die die diese Produkt-ID enthalten, ansonsten möchte ich alle Datensätze.

Ich brauche immer die Artikel, in denen die übergeordnete ID 1073 ist. Wenn und nur wenn eine Produkt-ID existiert, möchte ich die Artikel bei denen das Produkt I relatedProducts liste.

Verwenden Sie :

  <xsl:variable name="vDesiredArticles" select=
   "/*/Article[ID='1073'
              or
               contains(concat(',',relatedProducts,','),
                        concat(',', $pProductId, ',')
                        )
               ]"/>

Hier ist ein vollständiges und kurzes Beispiel :

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

 <xsl:param name="pProductId" select="1077"/>

 <xsl:template match="/">
  <xsl:variable name="vDesiredArticles" select=
   "/*/Article[ID='1073'
              or
               contains(concat(',',relatedProducts,','),
                        concat(',', $pProductId, ',')
                        )
               ]"/>
  <xsl:copy-of select="$vDesiredArticles"/>
 </xsl:template>
</xsl:stylesheet>

wenn diese Transformation auf das folgende XML-Dokument angewendet wird (basierend auf dem im Update bereitgestellten, aber interessanter gestaltet):

<Knowledgebase id="1073" parentID="-1" level="1" writerID="0"
creatorID="0" nodeType="1062" template="1083" sortOrder="5"
createDate="2011-04-20T13:43:41" updateDate="2011-05-11T14:34:23"
nodeName="Knowledgebase" urlName="knowledgebase" writerName="Chris"
creatorName="Chris" path="-1,1073" isDoc="">
    <pageTitle>Knowledgebase</pageTitle>
    <metaDescription>knowledgebase</metaDescription>
    <metaKeywords>knowledgebase</metaKeywords>
    <umbracoUrlName />
    <Article id="1074" parentID="1073" level="2"
    writerID="0" creatorID="0" nodeType="1063" template="1084"
    sortOrder="1" createDate="2011-04-20T13:44:13"
    updateDate="2011-05-16T09:39:12"
    nodeName="What is the answer to this question?"
    urlName="what-is-the-answer-to-this-question" writerName="Chris"
    creatorName="Chris" path="-1,1073,1074" isDoc="">
        <title>Change 2 Test 2</title>
        <summary>Change 2 Test 2</summary>
        <description>  &lt;p&gt;&lt;strong&gt;Change 2 Test 2&lt;br /&gt; &lt;/strong&gt;&lt;/p&gt; </description>
        <relatedProducts>1071,1076</relatedProducts>
        <pageTitle>asd</pageTitle>
        <metaDescription>asd</metaDescription>
        <metaKeywords>asd</metaKeywords>
        <umbracoUrlName />
    </Article>
    <Article id="1082" parentID="1073" level="2" writerID="0" creatorID="3" nodeType="1063" template="1084" sortOrder="2" createDate="2011-05-04T09:59:31" updateDate="2011-05-11T14:34:23" nodeName="Question 2" urlName="question-2" writerName="Chris" creatorName="Content Writer" path="-1,1073,1082" isDoc="">
        <title>test</title>
        <summary>test 22</summary>
        <description> &lt;p&gt;tst&lt;/p&gt;  </description>
        <relatedProducts>1075</relatedProducts>
        <pageTitle />
        <metaDescription></metaDescription>
        <metaKeywords></metaKeywords>
        <umbracoUrlName />
    </Article>
    <Article id="1088" parentID="1077" level="2" writerID="0" creatorID="3" nodeType="1063" template="1084" sortOrder="2" createDate="2011-05-04T09:59:31" updateDate="2011-05-11T14:34:23" nodeName="Question 2" urlName="question-2" writerName="Chris" creatorName="Content Writer" path="-1,1073,1082" isDoc="">
        <title>test</title>
        <summary>test 22</summary>
        <description> &lt;p&gt;tst&lt;/p&gt;  </description>
        <relatedProducts>1075,1039,1077</relatedProducts>
        <pageTitle />
        <metaDescription></metaDescription>
        <metaKeywords></metaKeywords>
        <umbracoUrlName />
    </Article>
    <Article id="1089" parentID="1077" level="2" writerID="0" creatorID="3" nodeType="1063" template="1084" sortOrder="2" createDate="2011-05-04T09:59:31" updateDate="2011-05-11T14:34:23" nodeName="Question 2" urlName="question-2" writerName="Chris" creatorName="Content Writer" path="-1,1073,1082" isDoc="">
        <title>test</title>
        <summary>test 22</summary>
        <description> &lt;p&gt;tst&lt;/p&gt;  </description>
        <relatedProducts>1075,1039,1078</relatedProducts>
        <pageTitle />
        <metaDescription></metaDescription>
        <metaKeywords></metaKeywords>
        <umbracoUrlName />
    </Article>
    <Article id="1146" parentID="1073" level="2" writerID="4" creatorID="3" nodeType="1063" template="1084" sortOrder="3" createDate="2011-05-13T15:36:14" updateDate="2011-05-13T15:37:21" nodeName="Question 3" urlName="question-3" writerName="Content Approver" creatorName="Content Writer" path="-1,1073,1146" isDoc="">
        <title>Test</title>
        <summary></summary>
        <description> &lt;p&gt;Test&lt;/p&gt; </description>
        <relatedProducts />
        <pageTitle>Test</pageTitle>
        <metaDescription>test</metaDescription>
        <metaKeywords>test</metaKeywords>
        <umbracoUrlName />
    </Article>
</Knowledgebase>

das gewünschte, korrekte Ergebnis erzielt wird (nur Artikel mit parentID="1073" oder deren relatedProducts enthält die $pProductId (1077)):

<Article id="1074" parentID="1073" level="2" writerID="0" creatorID="0" nodeType="1063" template="1084" sortOrder="1" createDate="2011-04-20T13:44:13" updateDate="2011-05-16T09:39:12" nodeName="What is the answer to this question?" urlName="what-is-the-answer-to-this-question" writerName="Chris" creatorName="Chris" path="-1,1073,1074" isDoc="">
   <title>Change 2 Test 2</title>
   <summary>Change 2 Test 2</summary>
   <description>  &lt;p&gt;&lt;strong&gt;Change 2 Test 2&lt;br /&gt; &lt;/strong&gt;&lt;/p&gt; </description>
   <relatedProducts>1071,1076</relatedProducts>
   <pageTitle>asd</pageTitle>
   <metaDescription>asd</metaDescription>
   <metaKeywords>asd</metaKeywords>
   <umbracoUrlName/>
</Article>
<Article id="1082" parentID="1073" level="2" writerID="0" creatorID="3" nodeType="1063" template="1084" sortOrder="2" createDate="2011-05-04T09:59:31" updateDate="2011-05-11T14:34:23" nodeName="Question 2" urlName="question-2" writerName="Chris" creatorName="Content Writer" path="-1,1073,1082" isDoc="">
   <title>test</title>
   <summary>test 22</summary>
   <description> &lt;p&gt;tst&lt;/p&gt;  </description>
   <relatedProducts>1075</relatedProducts>
   <pageTitle/>
   <metaDescription/>
   <metaKeywords/>
   <umbracoUrlName/>
</Article>
<Article id="1088" parentID="1077" level="2" writerID="0" creatorID="3" nodeType="1063" template="1084" sortOrder="2" createDate="2011-05-04T09:59:31" updateDate="2011-05-11T14:34:23" nodeName="Question 2" urlName="question-2" writerName="Chris" creatorName="Content Writer" path="-1,1073,1082" isDoc="">
   <title>test</title>
   <summary>test 22</summary>
   <description> &lt;p&gt;tst&lt;/p&gt;  </description>
   <relatedProducts>1075,1039,1077</relatedProducts>
   <pageTitle/>
   <metaDescription/>
   <metaKeywords/>
   <umbracoUrlName/>
</Article>
<Article id="1146" parentID="1073" level="2" writerID="4" creatorID="3" nodeType="1063" template="1084" sortOrder="3" createDate="2011-05-13T15:36:14" updateDate="2011-05-13T15:37:21" nodeName="Question 3" urlName="question-3" writerName="Content Approver" creatorName="Content Writer" path="-1,1073,1146" isDoc="">
   <title>Test</title>
   <summary/>
   <description> &lt;p&gt;Test&lt;/p&gt; </description>
   <relatedProducts/>
   <pageTitle>Test</pageTitle>
   <metaDescription>test</metaDescription>
   <metaKeywords>test</metaKeywords>
   <umbracoUrlName/>
</Article>

1voto

Richard Punkte 103159

Ich würde eine xsl:choose (um den anderen Teil mit einer xsl:otherwise ) sowie eine Vorlage:

<xsl:choose>
 <xsl:when test='@productId'>
   <xsl:apply-templates select='filter by product id' />
 </xsl:when>
 <xsl:otherwise>
   <xsl:apply-templates select='all of them' />
 </xsl:otherwise>

Definieren Sie dann eine Vorlage, um die Knotenliste zu verarbeiten.

0voto

Alan Delimon Punkte 818

Sie können die Prüfung im Konstrukt der foreach-Schleife wie folgt durchführen:

<xsl:for-each select="item[@productId != '']">

Die Bedingung in dem [] nach dem Element in der Auswahl zeigt an, dass Sie nur Elemente mit diesem Attribut haben wollen, die die Bedingung erfüllen. So etwas wie dies würde also passen: < item productId="BR9ES" >

B < Artikel >

0voto

Jason Gennaro Punkte 33907

Damit prüfe ich, ob ein Element in meinem XML-Dokument vorhanden ist:

<xsl:if test="@productID[.!='']">       //if it is not empty
<xsl:value-of select="@productID"/>     
</xsl:if>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X