2011-05-16 43 views
2

如何在XSLT中的條件循環中包含if語句?XSLT有條件的For-Each

我有2或3個不同的場景來定義我想要循環的數據。例如,可能有或沒有產品ID。如果有,我只想遍歷包含該產品ID的記錄,否則我需要所有記錄。我試圖做這樣的事情:

<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。我知道這兩個條件是一樣的,一旦我開始工作,我會重寫一個條件。預先感謝任何幫助!

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> 

我總是需要在父ID是1073.如果物品且僅當一個產品ID存在,我想的文章,其中產品ID位於relatedProducts列表中。再次感謝!

+0

好問題,+1。查看我的答案,獲取完整,簡短且易於使用的XPath表達式解決方案。 :) – 2011-05-16 13:44:03

+0

>「但它無法解析XSLT。」 - 是否有錯誤消息?如果是這樣,如果你告訴我們這個消息,它會讓每個人的生活更輕鬆。 – 2011-05-16 21:52:08

+0

會嗎?好吧。該消息非常有創意地說「無法解析Knowledgebase.xslt」。 – Dexter 2011-05-17 11:06:59

回答

3

例如,有可能會或可能不會是 產品ID。如果有,我想要 只循環包含 那個產品ID的記錄,否則我想要所有的 記錄。

我總是需要當且僅當一個 產品ID存在,我想文章 該產品ID是在 relatedProducts名單,其中 父ID爲1073的文章。

使用

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

Dimitre - 這是我解決這個問題的首選方法 - 我不是真的想擁有多個模板,因爲可能有幾個例子,模板實際上是相同的,只是結果不同而已。但是,它不是parentId我需要檢查它的productId和relatedProducts可能是一個列表。我嘗試了以下,但似乎並沒有工作:> – Dexter 2011-05-16 15:58:36

+0

@Dexter:我很困惑 - 然後在你提供的代碼中使用'$ parentID'。這是一個錯誤嗎?您可能需要編輯問題並澄清/更正此問題。 – 2011-05-16 17:03:05

+0

@Dimitre:不,這是正確的,$ parentID是我正在使用的變量之一。 $ parentID將永遠存在。如果它存在,我還需要檢查$ productId。這有意義嗎?如果不清楚,我很抱歉。 – Dexter 2011-05-16 17:51:11

0

你可以檢查在foreach循環結構,像這樣:

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

中的condtion的[]在選擇項目後,表示您僅希望與屬性匹配條件的項目。因此,像這樣將匹配: <項目的productId =「BR9ES」>

但這並不: <項目>

+1

如果產品ID不存在,我不想將它包含在比較中?我如何檢查兩種情況? – Dexter 2011-05-16 13:41:37

+0

您可以使用第二個循環,如下所示: 2011-05-16 14:05:19

0

這是我用它來測試,如果在我的XML文檔中存在的元素:

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

如果產品ID不存在,我不想將它包含在比較呢?我如何檢查兩種情況? – Dexter 2011-05-16 13:41:50

+0

@Richard是正確的。然後我會使用'xsl:choose'。 – 2011-05-16 14:05:41

1

我會用一個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> 

然後定義一個模板處理節點列表。