XSL只在for..each中执行一次

时间:2016-04-18 22:13:48

标签: xml xslt

我试图在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中检查并执行空节点条件?

2 个答案:

答案 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>&#10;</xsl:text>
</xsl:template>

<xsl:template match="SomeNode[not(normalize-space())]">
    <xsl:text>Node Value Empty</xsl:text>
    <xsl:text>&#10;</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;。