我试图在for-each
循环内的XSL中执行一次只有一次。我不知道节点将为空的循环position
。
<xsl:for-each select="SomeNode">
<xsl:if test="CONDITION 1">
<!-- SHOW Node Value -->
</xsl:if>
<xsl:if test="(current() = '')"> <!-- If node is empty -->
<!-- SHOW default value, but only once -->
Node Value Empty
</xsl:if>
</xsl:for-each>
对于ex:,
<Nodes>
<SomeNode>Node Value 1</SomeNode>
<SomeNode></SomeNode>
<SomeNode></SomeNode>
<SomeNode>Node Value 2</SomeNode>
<SomeNode></SomeNode>
<SomeNode></SomeNode>
<SomeNode></SomeNode>
<SomeNode>Node Value 3</SomeNode>
...
</Nodes>
在上面的XML中,我期待输出如下,
Node Value 1
Node Value Empty
Node Value 2
Node Value 3
.. (an so on only if SomeNode is not empty)
如何在for-each中检查并执行空节点条件?
答案 0 :(得分:2)
这是你可以做到的一种方式:
$delete_query = mysqli_query($connect, "DELETE FROM `private_messages` WHERE
( `message_from`='$username' AND `message_to`='$user' )
OR
( `message_from`='$user' AND `message_to`='$username' )");
这假设您需要第一个空节点出现在其原始位置 - 否则它可能更简单:
<xsl:template match="/Nodes">
<xsl:apply-templates select="SomeNode[normalize-space()] | SomeNode[not(normalize-space())][1]"/>
</xsl:template>
<xsl:template match="SomeNode[normalize-space()]">
<xsl:value-of select="." />
<xsl:text> </xsl:text>
</xsl:template>
<xsl:template match="SomeNode[not(normalize-space())]">
<xsl:text>Node Value Empty</xsl:text>
<xsl:text> </xsl:text>
</xsl:template>
答案 1 :(得分:0)
嗯,你不能用for-each做你想要的。将for-each视为处理选择中的所有项目并行而不是按顺序。处理一个项目不能以任何方式取决于选择中存在的其他项目(使用position()
和last()
除外)。
如果要按顺序处理序列(一次一个项目),那么通常在XSLT 1.0和2.0中需要递归。在3.0中,您可以使用xsl:iterate。
但是,在所选节点是兄弟节点的情况下,如本例所示,在处理特定节点以检查树中的周围环境时,还有一个选项。当处理xsl中的节点时,它是不可能的:for-each要求&#34;这是第一个选择的条件为C&#34;但是可以询问&#34;这个节点任何先前的兄弟姐妹都有条件C&#34;。