Xml 在XSLT中为每个循环只执行一次条件(每个循环中断)

Xml 在XSLT中为每个循环只执行一次条件(每个循环中断),xml,xslt,Xml,Xslt,我是XSLT新手,有这个问题。我发现很多帖子和材料,XSLT中的每个循环都无法中断,并且变量在声明后无法更改,但我找不到解决问题的方法。如果有一个已经回答,请提供一个链接 我想检查给定节点集中是否存在至少一个包含特定值的元素。如果是这样,我希望在转换中仅创建一次具有属性的元素 <xsl:variable name="name" select="$path/to/something"/> <xsl:if test="count($name) > 0">

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

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

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

当前,如果多次满足条件检查,它将创建多个相同的元素,我只需要创建该元素一次

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

电流输出

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


补充:

演示下面的样式表:

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


@bigneo恐怕你误解了我的意思。我不是想纠正你的问题。我的意思是通过改变你看待问题的方式来找到答案。如果您认为上述结果不正确,请提供一个XML输入和预期输出的示例。我已经用您提出的示例编辑了问题,同时我仍在试图理解您的答案。正如我所说的-对XSLT来说是全新的。@bigneo我在我的答案中添加了两个演示。