2017-11-11 128 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

相关问题