选择for-each inside?

时间:2017-03-14 18:58:46

标签: xslt foreach

我有一个参数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>

显然不是那样(否则我不会问。)

我知道我可以绕过tokenizefor-each循环,只需在ignoreAttributes上使用replaces并将所有,更改为|,然后再使用matches,但我希望尽可能避免这种情况,因为我需要处理ignoreAttributes(用户提供的)可能包含一些特殊字符以改变正则表达式模式的可能性并逃避他们。

2 个答案:

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

以获得truefalse作为结果。

答案 1 :(得分:1)

  

我有一个parameterignoreAttributes,它是一个逗号分隔的要查找的事物列表。我想将变量copyAttrib设置为是否与name()完全匹配。

听起来像是

<xsl:variable name="copyAttrib" as="xs:boolean"
  select="tokenize($parameterignoreAttributes, ',') = name()"/>

你说:

  

不幸的是,我不能这样做,因为xsl功能正常

当你的意思是:“幸运的是,我不需要这样做,因为XSLT是功能性的”。