我有一个参数ignoreAttributes
,它是一个逗号分隔的事物列表。我想将变量copyAttrib
设置为等于name()
是否完全匹配它们。
如果xsl
是一种可以重新分配变量的过程语言,我会使用以下内容:
<xsl:variable name="copyAttrib" select="true()">
<xsl:for-each select="tokenize($ignoreAttributes,',')">
<xsl:if test="compare(., name()) != 0">
<xsl:variable name="copyAttrib" select="false()"/>
</xsl:if>
</xsl:for-each>
不幸的是,我无法做到这一点,因为xsl
是有效的(所以说this other answer)。所以变量只能分配一次。
我认为解决方案看起来像:
<vsl:variable name="copyAttrib">
<xsl:choose>
<xsl:when>
<xsl:for-each select="tokenize($ignoreAttributes, ',')">
<xsl:if test="compare(., name()) != 0"/>
</xsl:for-each>
<xsl:otherwise>
<xsl:value-of select="false()"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
显然不是那样(否则我不会问。)
我知道我可以绕过tokenize
和for-each
循环,只需在ignoreAttributes上使用replaces
并将所有,
更改为|
,然后再使用matches
,但我希望尽可能避免这种情况,因为我需要处理ignoreAttributes
(用户提供的)可能包含一些特殊字符以改变正则表达式模式的可能性并逃避他们。
答案 0 :(得分:1)
XSLT-1.0这样做的方法是使用递归的命名模板:
<xsl:template name="copyAttrib">
<xsl:param name="attribs" />
<xsl:choose>
<xsl:when test="normalize-space(substring-before($attribs,',')) = normalize-space(name(.))">
<xsl:value-of select="'true'" />
</xsl:when>
<xsl:when test="normalize-space($attribs) = ''">
<xsl:value-of select="'false'" />
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="copyAttrib">
<xsl:with-param name="attribs" select="substring-after($attribs,',')" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
将此模板应用于当前的选定节点,并将其包装在<xsl:variable>
:
<xsl:variable name="copyAttribResult">
<xsl:call-template name="copyAttrib">
<xsl:with-param name="attribs" select="'a,b,c,...commaSeparatedValues...'" />
</xsl:call-template>
</xsl:variable>
以获得true
或false
作为结果。
答案 1 :(得分:1)
我有一个parameterignoreAttributes,它是一个逗号分隔的要查找的事物列表。我想将变量copyAttrib设置为是否与name()完全匹配。
听起来像是
<xsl:variable name="copyAttrib" as="xs:boolean"
select="tokenize($parameterignoreAttributes, ',') = name()"/>
你说:
不幸的是,我不能这样做,因为xsl功能正常
当你的意思是:“幸运的是,我不需要这样做,因为XSLT是功能性的”。