[英]Cannot re-assign a value to XSLT variable, or can I exit from for-each loop conditionally
无法将值重新分配给XSLT变量,或者我可以退出
<xsl:for-each
有条件
我的XML
<R>
<A id="a">
<S id="a111">1</S>
<S id="a222">2</S>
<S id="a333">3
<S id="a3331">3.1</S>
<S id="a3332">3.2</S>
<S id="a3333">3.3</S>
</S>
<S id="a444">4</S>
<S id="a555">5</S>
<S id="a666">6</S>
</A>
<A id="x">
<S id="x111">1</S>
<S id="x222">2</S>
<S id="x333">3
<S id="x3331">3.1</S>
<S id="x3332">3.2</S>
<S id="x3333">3.3</S>
</S>
<S id="x444">4</S>
<S id="x555">5</S>
<S id="x666">6</S>
</A>
</R>
我的XSLT
<select id ="S" name="SList">
<option>
<xsl:attribute name="value"></xsl:attribute> Please Select S
</option>
<xsl:for-each select="A[id='x']//S">
<xsl:if test="'x3333'= @id">
<xsl:variable name="currentS" select="true()"/>
</xsl:if>
<xsl:if test="'x3333'!= @id">
<xsl:variable name="currentS" select="false()"/>
</xsl:if>
<xsl:if test="@currentS = false()">
<option>
<xsl:if test="@id = 'x3333'">
<xsl:attribute name="selected">selected</xsl:attribute>
</xsl:if>
<xsl:attribute name="value">
<xsl:value-of select="@id"/>
</xsl:attribute>
<xsl:value-of select="Text"/>
</option>
</xsl:if>
</xsl:for-each>
我正在尝试创建一个下拉列表,并且需要在列表中包括S
项目。 我正在传递当前位置(当前为S
,在本示例中为x3333
)和A
当前id。 我只想获取最近的A
元素中的S
元素列表。
在这个例子中,因为我现在的S
是x3333
和ID A
是x
我只需要x111
, x222
, x333
, x3331
, x3332
是在列表中。 这意味着我需要消除这些
<S id="x444">4</S>,
<S id="x555">5</S>,
<S id="x666">6</S>, nodes
从此代码<xsl:for-each select="A[id='x']//S">
我正在A
中id='x'
的S
元素列表
有人可以给我建议解决方案吗?
在XSLT中对变量执行操作的一种方法是在变量的select中使用XPath if语句:
<xsl:variable name="currentS" select=" if (@id = 'x3333') then true() else false()"/>
XPath if在尝试执行其变量应取决于if-then构造的变量时非常有用。 但这仅在XPath 2.0处理器中可用,并且看起来OP使用1.0处理器。 这应该工作:
<xsl:variable name="currentS" select="@id = 'x3333'"/>
目前尚不清楚您尝试做什么。
这里给您一些提示xslt:
错误访问属性: <xsl:for-each select="A[id='x']//S">
要测试属性ID,请使用@id: <xsl:for-each select="A[@id='x']//S">
您不能重新定义变量:
<xsl:if test="'x3333'= @id">
<xsl:variable name="currentS" select="true()"/>
</xsl:if>
<xsl:if test="'x3333'!= @id">
<xsl:variable name="currentS" select="false()"/>
</xsl:if>
仅在xsl:if的范围内定义变量currentS。 要根据属性ID设置变量值,请尝试以下操作:
<xsl:variable name="currentS">
<xsl:choose>
<xsl:when test="@id = 'x3333'">
<xsl:text>true</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>false</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
错误访问变量值: <xsl:if test="@currentS = false()">
xslt变量访问是通过wint $
前缀完成的。
<xsl:if test="$currentS = 'false'">
根据我对您的xlst的解释,这可能会有所帮助:
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:template match="R">
<select id ="S" name="SList">
<option>
<xsl:attribute name="value"></xsl:attribute> Please Select S
</option>
<xsl:for-each select="A[@id='x']//S">
<xsl:variable name="currentS">
<xsl:choose>
<xsl:when test="preceding::S[@id = 'x3333']">
<xsl:text>true</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>false</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:if test="$currentS = 'false'">
<option>
<xsl:if test="@id = 'x3333'">
<xsl:attribute name="selected">selected</xsl:attribute>
</xsl:if>
<xsl:attribute name="value">
<xsl:value-of select="@id"/>
</xsl:attribute>
<xsl:value-of select="normalize-space(text())"/>
</option>
</xsl:if>
</xsl:for-each>
</select>
</xsl:template>
</xsl:stylesheet>
产生以下输出:
<?xml version="1.0"?>
<select id="S" name="SList">
<option value="">
Please Select S
</option>
<option value="x111">1</option>
<option value="x222">2</option>
<option value="x333">3</option>
<option value="x3331">3.1</option>
<option value="x3332">3.2</option>
<option selected="selected" value="x3333">3.3</option>
</select>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.