这不是唯一的关于此问题的问题,但我无法从其他解决方案中弄清楚我的代码为什么有错。这是为了一个作业,我已经大部分搞定了,但我无法理解为什么条件从未计算为true。如果我编写一个虚拟子句,例如contains('a', 'a')
或者1=1
,那么我可以看到正确的输出(显然没有经过条件过滤)。
此外,如果我只是尝试输出当前元素的名称,使用<xsl:value-of select="name(.)" />
,则没有任何输出。显然,这里有些事情我没有理解,但它一直在逃避我。有什么线索吗?
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" indent="yes" encoding="ISO-8859-1"/>
<xsl:template match="/">
<xsl:apply-templates select="node()" />
</xsl:template>
<xsl:template match=".">
<xsl:if test="contains(name(.),'a')">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates select="child::node()" />
</xsl:copy>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
在这种情况下,XML模式并不重要。我知道一些元素包含字母a(包括根元素)。
同时,为什么当我调用
<xsl:value-of select="name(node())" />
时,我得到的是XSLT文件节点的名称(“xsl:stylesheet”),而不是正在被我的XSLT文档处理的当前节点的名称?谢谢!
match='.'
,这样我就可以使用<xsl:apply-templates select="child::node()" />
来进一步深入一层,如果当前层满足条件。我现在遇到的问题是,如果有一点条件不满足,执行就会停止。这就是为什么我的输出总是为空的原因。它首先找到了 xml:stylesheet,然后跳过了其余部分。 - undefinedxsl:stylesheet
,那么你的调用就出错了。你正在用样式表作为输入数据来调用样式表。在你的问题中没有显示出输入数据是什么。如果确实有xml:stylesheet
作为其文档元素,那么当输出为空时,满足“清除所有子项”的要求。顺便说一句,当在<xsl:apply-templates/>
中省略select=
时,它是select="child::node()"
的缩写。 - undefined