XSLT условно в For-Each - PullRequest
       1

XSLT условно в For-Each

2 голосов
/ 16 мая 2011

Как включить оператор if в свой цикл в XSLT?

У меня есть 2 или 3 разных сценария, которые определяют данные, которые я хочу просмотреть. Например, может быть или не быть идентификатор продукта. Если это так, я хочу просматривать только те записи, которые содержат этот идентификатор продукта, в противном случае мне нужны все записи. Я пытался сделать что-то вроде этого:

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

Но он не может проанализировать XSLT. Я знаю, что 2 условия одинаковы, я собирался переписать одно, как только оно заработало. Заранее спасибо за любую помощь!

UPDATE:

Вот пример XML:

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

Мне всегда нужны статьи, в которых идентификатор родителя равен 1073. Если и только если идентификатор продукта существует, мне нужны статьи, в которых идентификатор продукта находится в списке связанных продуктов. Еще раз спасибо!

Ответы [ 4 ]

3 голосов
/ 16 мая 2011

Например, может быть или не быть Код товара. Если есть, я хочу только циклически проходить записи, содержащие этот идентификатор продукта, в противном случае я хочу все записи.

Мне всегда нужны статьи, где ID родителя 1073. Если и только если Идентификатор товара существует, я хочу статьи где идентификатор продукта находится в relatedProducts список.

Используйте

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

Вот полный и краткий пример :

<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[@parentID='1073'
              or
               contains(concat(',',relatedProducts,','),
                        concat(',', $pProductId, ',')
                        )
               ]"/>
  <xsl:copy-of select="$vDesiredArticles"/>
 </xsl:template>
</xsl:stylesheet>

когда это преобразование применяется к следующему документу XML (на основе предоставленного в Обновлении, но сделанного более интересным):

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

желаемый, правильный результат получается (только статьи с parentID="1073" или чей relatedProducts содержит $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>
1 голос
/ 16 мая 2011

Я бы использовал xsl:choose (чтобы получить остальную часть с xsl:otherwise) плюс шаблон:

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

И затем определил шаблон для обработки списка узлов.

0 голосов
/ 16 мая 2011

Это то, что я использую, чтобы проверить, существует ли элемент в моем XML-документе:

<xsl:if test="@productID[.!='']">       //if it is not empty
<xsl:value-of select="@productID"/>     
</xsl:if>
0 голосов
/ 16 мая 2011

Вы можете выполнить проверку в конструкции цикла foreach, например:

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

Условие в элементе [] после элемента select указывает, что вы хотите, чтобы только элементы с этим атрибутом соответствовали условию.Таким образом, что-то вроде этого будет соответствовать:

Но это не будет:

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