2017-11-11 295 views
0

我實際上必須爲xml製作關於食譜的xsl文件。我只需要展示用特定配料製作的食譜。該XML文件是這樣的:如何檢查至少一個孩子的屬性是否包含XSLT中的特定單詞?

<recipe name="A"> 
    <ingrediente name="B"></ingredient> 
    <ingrediente name="C"></ingredient> 
</recipe> 

我做這樣的事情:

<xsl:for-each select="recipe"> 
    <xsl:if test="contains(ingredient/@name,'C')"> 
     Shows the recipe 
    </xsl:if> 
</xsl:for-each> 

我有一個問題,因爲當我試試就知道了,如果ingredientes的至少一個具有特定的名稱,它只是咀嚼第一種成分。在該例子中,配方「A」具有成分「C」,但它不會被顯示,因爲它只檢查第一成分,即「B」。如果「C」是第一種成分,則顯示配方。

任何想法如何做到這一點? (並且對不起,如果我的英文不是很好)

+0

'ingrediente'或'配料'?你的XML格式不正確。請勿重新鍵入代碼,請使用複製/粘貼以避免引入錯別字。 –

+0

爲什麼不在開始時在選擇查詢中搜索配方/配料[@ name ='C']並取消if子句?我不能測試我的建議,因爲我不在家,所以它可能不是100%正確的。 –

+0

如果僅考慮第一個元素,而不是報告錯誤,則表示您正在使用XPath 1.0而不是更高版本。由於這顯然是一項學術活動,您爲什麼要使用該語言的過時版本? –

回答

0

你必須在腳本中只做一些小的改動。

的理念是:

  • 乘坐recipe檢查。
  • 轉到 「下降」 到每個ingredient ...
  • 和檢查(在謂語)是否任何其屬性(@*)...
  • 含有特定字符串。
  • 然後上升一級(/..)並返回當前(recipe)元素 以供進一步處理。

所以for-each迴路應如下:

<xsl:for-each select="recipe/ingredient[contains(@*,'C')]/.."> 
    <xsl:copy-of select="."/> 
</xsl:for-each> 

注意,有可能檢查任何屬性包含指定的字符串,就像你在標題中寫道。

0

變化

<xsl:for-each select="recipe"> 
    <xsl:if test="contains(ingredient/@name,'C')"> 
     Shows the recipe 
    </xsl:if> 
</xsl:for-each> 

<xsl:for-each select="recipe[ingredient/@name='C']"> 
    Shows the recipe 
</xsl:for-each> 

這樣的迭代超過只有針對性recipes具體規定。還請注意,您不應在此處使用,或者您還將匹配CarrotsCorn

相關問題