xslt 1.0:检查是否有任何源节点包含任何目标节点的文本

时间:2016-11-30 17:45:37

标签: xml xslt-1.0

仅使用不带扩展名的xslt 1.0。

举个例子:

<forest>
<hunter>fast antelope</hunter>
<hunter>jumping deer</hunter>
<hunter>large elk</hunter>
<hunter> </hunter>
<prey>rabbit</prey>
<prey>eagle</prey>
<prey>deer</prey>
<prey>elk</prey>
<prey></prey>
</forest>

<forest>
<hunter>fast antelope</hunter>
<hunter>jumping deer</hunter>
<hunter>large elk</hunter>
<hunter> </hunter>
<prey>rabbit</prey>
<prey>eagle</prey>
<prey>fox</prey>
<prey>goose</prey>
<prey></prey>
</forest>

如何编写<xsl:if><xsl:when>测试以检查至少有一个<hunter>包含至少一个<prey>的文本,但不匹配<hunter><prey>中的空或仅空白文本节点?

可能有更多节点,因此这必须是纯文本模式,没有位置技巧等。

我的预期结果将是示例一中的匹配(基于鹿,<prey>中的麋鹿)和示例二中的失败(仅限空白和text()个节点)。

谢谢!

1 个答案:

答案 0 :(得分:1)

怎么样:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/forest">
    <xsl:variable name="marker">
        <xsl:for-each select="hunter">
            <xsl:if test="../prey[normalize-space()][contains(current(), .)]">1</xsl:if>
        </xsl:for-each>
    </xsl:variable>
    <result>
        <xsl:choose>
            <xsl:when test="string($marker)">
                <xsl:text>Match</xsl:text>
            </xsl:when>
            <xsl:otherwise>
                <xsl:text>No Match</xsl:text>
            </xsl:otherwise>
        </xsl:choose>
    </result>
</xsl:template>

</xsl:stylesheet>