如何使用 xsl/xslt 检查 xml 文件中节点的值是否总是取自另一个修复节点的值?



我正在使用xsl/xslt 1.0版本检查xml文件中的一些条件。对于其中一个检查,我必须确保一个节点的值只能从另一个节点的值中获取。例如:

sample.xml:

<fruit-garden>
<fruit-available>
<fruit>apple</fruit>
<fruit>banana</fruit>
</fruit-available>
<fruit-for-dinner>
<fruit>apple</fruit>[should-be-fine]
<fruit>mango</fruit>[should-not-be-fine]
</fruit-for-dinner>
</fruit-garden>

在sample.xml中,假设我们需要/fruit-for-dinner/fruit的值仅来自XSLT 1.0的/fruit-available/fruit的值之一,我无法想到一种方法来编程。

我想也许set:difference可以在这里有用,但看起来它在一个固定的节点路径上运行。任何方向正确的提示都会对我有帮助。

使用<xsl:key name="available-fruits" match="fruit-available/fruit" use="."/>,然后您可以检查例如<xsl:template match="fruit-for-dinner/fruit[not(key('available-fruits', .)]">not right</xsl:template>

根据您的问题,您可以使用这两个模板的任何变体来吃或不吃。创建一个键匹配,然后使用它。我做这个稍微冗长,是为了展示它的两种用法(匹配或不匹配)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:key name="available" match="fruit-available/fruit" use="." /> 
<xsl:template match="/">
<garden>
<xsl:apply-templates select="fruit-garden"/>
</garden>
</xsl:template>
<xsl:template match="/fruit-garden">
<caneat>
<xsl:apply-templates select="fruit-for-dinner/fruit[key('available', .)]"/>
</caneat>
<bob-ate-it>
<xsl:apply-templates select="fruit-for-dinner/fruit[not(key('available', .))]"/>
</bob-ate-it>
</xsl:template>
<xsl:template match="fruit"> 
<eatme>
<xsl:value-of select="."/>
</eatme>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>

的示例输出
<?xml version="1.0" encoding="UTF-8"?>
<garden>
<caneat>
<eatme>apple</eatme>
<eatme>pear</eatme>
</caneat>
<bob-ate-it>
<eatme>mango</eatme>
</bob-ate-it>
</garden>

相关内容

  • 没有找到相关文章

最新更新