在XSLT中,对每个循环只执行一次中的条件(每个循环中断)



我是XSLT的新手,有这个问题。我发现许多帖子和材料都无法打破XSLT中的每个循环,并且在声明变量后无法更改变量,但我找不到解决问题的方法。如果已经有答案,请提供链接。

我想检查在给定的节点集中是否存在至少一个包含特定值的元素。如果是,我希望在转换中创建一个具有属性ONLY 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>

有什么简单的解决方案

我需要循环所有元素,并检查它是否包含特定的值,如果是,我想创建一个具有属性的元素。但是我只想创建一次具有该属性的元素,而不管是否循环继续并且随后满足更多条件。

将您的问题重述如下:

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

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

<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>

最新更新