1

我有以下模板来传回过滤器属性:

<xsl:template name="have_arch_attrib">
<xsl:variable name="condition_values"/>
<xsl:variable name="security_values"/>
<xsl:variable name="arch_values"/>
<xsl:choose> 
    <xsl:when test=".[@arch]"> <!-- add arch values -->
        <xsl:variable name="arch_values" select=".[@arch]" />
    </xsl:when>

    <xsl:when test=".[@condition]"> <!-- Add condition values -->
        <xsl:variable name="condition_values" select=".[@condition]" />
    </xsl:when>

    <xsl:when test=".[@security]"> <!-- Add condition values -->
        <xsl:variable name="security_values" select=".[@security]"/>
    </xsl:when>
</xsl:choose>
<xsl:attribute name="filter"><xsl:value-of select="concat($condition_values, $security_values, $arch_values)"/></xsl:attribute>

我看过其他解决方案,但我看不出它们如何适用于此?

谁能给我一个线索?

谢谢,

拉斯

4

2 回答 2

2

<xsl:attribute>错误消息非常具有描述性 -在添加任何子节点(元素、文本节点、注释或处理指令)之后,您无法使用属性节点将属性节点添加到元素。因此,导致该错误消息的问题在于调用have_arch_attrib模板之前发生的事情,而不是模板本身。

也就是说,您在此处提供的模板不会产生您想要的结果,因为您无法在创建 XSLT 变量后修改它的值。您将需要重新构造模板以将其<xsl:choose> 放在. 中<xsl:attribute>,而不是尝试使用变量来携带各种值。或者实际上只是完全失去了选择,因为要求value-of不存在的属性不是错误,您只需获得空字符串。

<xsl:attribute name="filter">
  <xsl:value-of select="@condition"/>
  <xsl:value-of select="@security"/>
  <xsl:value-of select="@arch"/>
</xsl:attribute>
于 2013-05-31T21:56:35.730 回答
1

您的模板存在一些问题。

  • 变量的值在初始化后不能改变。
  • 你的测试条件是错误的。你应该看起来像 <xsl:when test="@arch">
  • 如果分配给变量将起作用,则只有具有现有属性的第一个会获得一个值,因为只有第一个 when 具有测试通过的部分才会被执行。
  • 目前还不清楚你的目标是什么。

将您的模板解释为伪代码将是: 属性过滤器应该获取第一个现有属性的值(超出拱门、条件或安全性)。这将是这个 xlst:

<xsl:template name="have_arch_attrib">
    <xsl:attribute name="filter">
    <xsl:choose>
        <xsl:when test="@arch">
            <xsl:value-of select="@arch" />
        </xsl:when>
        <xsl:when test="@condition">
            <xsl:value-of select="@condition" />
        </xsl:when>
        <xsl:when test="@security">
            <xsl:value-of select="@security" />
        </xsl:when>
    </xsl:choose>
    </xsl:attribute>
</xsl:template>

根据您对伊恩·罗伯茨的回答的评论:
我检查属性是否存在的唯一原因是我需要用“,”分隔任何属性。我可以看到我可以如何更改这些属性

尝试这样的事情:

    <xsl:attribute name="filter">
            <xsl:if test="@arch">
                <xsl:value-of select="@arch" />
                <xsl:text>,</xsl:text>
            </xsl:if>
            <xsl:if test="@condition">
                <xsl:value-of select="@condition" />
                <xsl:text>,</xsl:text>
            </xsl:if>
            <xsl:if test="@security">
                <xsl:value-of select="@security" />
            </xsl:if>
    </xsl:attribute>
</xsl:template>

这当然仍然不完美,但是您的陈述还不够清楚。
如果“ delimit ”表示分隔,上述模板将生成一个不习惯的终止逗号。为避免这种情况,您可以尝试:

 <xsl:template name="have_arch_attrib">
    <xsl:attribute name="filter">
        <xsl:for-each select="@arch | @condition | @security ">
            <xsl:value-of select="." />
            <xsl:if test="position() != last()" >
                <xsl:text>,</xsl:text>
            </xsl:if>
        </xsl:for-each>
        </xsl:attribute>
</xsl:template>
于 2013-06-01T08:55:13.377 回答