我对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>
对此有什么简单的解决方法?
答案 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>