如何检查XSLT中是否至少有一个子属性包含特定单词?

时间:2017-11-11 18:28:43

标签: xml xslt

我实际上必须为xml创建一个关于食谱的xsl文件。我只需要展示用特定成分制作的食谱。 xml文件如下所示:

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

我遇到了一个问题,因为当我试图知道至少有一种成分是否有特定的名称时,它只是在讨论第一种成分。在该实例中,配方“A”具有成分“C”,但是它将不会显示,因为它仅检查第一种成分,即“B”。如果“C”是第一种成分,则显示配方。

知道如何做这项工作吗? (对不起,如果我的英语不是很好)

2 个答案:

答案 0 :(得分:0)

您只需对脚本稍作修改即可。

这个想法是:

  • 选择recipe进行检查。
  • Go&#34; down&#34;每个ingredient ......
  • 并检查(在谓词中)任何其属性(@*)...
  • 包含特定字符串。
  • 然后上升一级(/..)并返回当前(recipe)元素 进一步处理。

所以for-each循环应该如下所示:

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

请注意,可以检查任何属性是否包含指定的字符串,就像您在标题中所写的一样。

答案 1 :(得分: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。另请注意,您不应在此使用contains(),或者您还要匹配CarrotsCorn