在XSLT中仅在for-each循环中执行一次条件(break-each)

时间:2015-11-13 12:28:47

标签: xml xslt

我对XSLT很新,并且遇到了这个问题。我发现很多帖子和材料没有办法打破 - XSLT中的每个循环,并且在声明它们之后变量无法更改,但我无法找到解决问题的方法。如果有人已经回答,请提供链接。

我想检查给定节点集中是否存在至少一个包含特定值的元素。如果是这样,我想在变换中创建一个仅具有ONCE ONCE属性的元素。

<xsl:variable name="name" select="$path/to/something"/>
    <xsl:if test="count($name) > 0">
        <xsl:for-each select="$name">
            <xsl:if test="ctvf:trim(./@name) = 'P'">
                <name>
                    <xsl:attribute name="Name">
                        <xsl:value-of select="ctvf:trim(./@name)"/>
                    </xsl:attribute>
                </name>
            </xsl:if>
        </xsl:for-each>
    </xsl:if>

目前,如果多次满足条件检查<xsl:if test="ctvf:trim(./@name) = 'P'">,它会创建几个相同的元素,我只需要创建一次该元素。

示例XML

<names>
    <name name="P"></name>
    <name name="B"></name>
    <name name="A"></name>
    <name name="P"></name>
</names>

预期输出

<name Name="P"></name>

当前输出

<name Name="P"></name>
<name Name="P"></name>

对此有什么简单的解决方法?

1 个答案:

答案 0 :(得分:1)

  

我需要循环所有元素并检查它包含的特定天气   值,如果是的话,我想创建一个具有属性的元素。但是我   想要只创建一次具有该属性的元素,无论如何   循环继续,之后会满足更多条件。

重申您的问题如下:

我想检查给定节点集中是否存在至少一个包含特定值的元素。如果是,我想创建一个具有属性的元素。

在调整你的例子之后,可能看起来像这样:

<xsl:variable name="name" select="$path/to/something"/>
<xsl:if test="$name[ctvf:trim(@name) = 'P']">
    <name Name="P"/>
</xsl:if>

加了:

要演示,请考虑以下样式表:

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="/names">
    <xsl:if test="name[@name = 'P']">
        <name Name="P"/>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>

应用于您的输入示例,结果将是:

<?xml version="1.0" encoding="UTF-8"?>
<name Name="P"/>

应用于此示例:

<names>
    <name name="X"></name>
    <name name="B"></name>
    <name name="A"></name>
    <name name="Y"></name>
</names>

结果将为空。

实现同样目标的另一种方法是:

<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:strip-space elements="*"/>

<xsl:template match="name[@name = 'P'][1]">
    <name Name="P"/>
</xsl:template>

</xsl:stylesheet>