我正在使用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>