如何检查至少一个孩子的属性是否包含XSLT中的特定单词?
问题描述:
我实际上必须为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”是第一种成分,则显示配方。
任何想法如何做到这一点? (并且对不起,如果我的英文不是很好)
答
你必须在脚本中只做一些小的改动。
的理念是:
- 乘坐
recipe
检查。 - 转到 “下降” 到每个
ingredient
... - 和检查(在谓语)是否任何其属性(
@*
)... - 含有特定字符串。
- 然后上升一级(
/..
)并返回当前(recipe
)元素 以供进一步处理。
所以for-each
回路应如下:
<xsl:for-each select="recipe/ingredient[contains(@*,'C')]/..">
<xsl:copy-of select="."/>
</xsl:for-each>
注意,有可能检查任何属性包含指定的字符串,就像你在标题中写道。
答
变化
<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
具体规定。还请注意,您不应在此处使用,或者您还将匹配Carrots
和Corn
。
'ingrediente'或'配料'?你的XML格式不正确。请勿重新键入代码,请使用复制/粘贴以避免引入错别字。 –
为什么不在开始时在选择查询中搜索配方/配料[@ name ='C']并取消if子句?我不能测试我的建议,因为我不在家,所以它可能不是100%正确的。 –
如果仅考虑第一个元素,而不是报告错误,则表示您正在使用XPath 1.0而不是更高版本。由于这显然是一项学术活动,您为什么要使用该语言的过时版本? –