XSLT:条件属性值处理

时间:2009-07-10 22:25:55

标签: xslt

以下内容未按预期运行:

<xsl:template match="xs:complexType">
  <xsl:param name="prefix" />

  <xsl:if test="$prefix='core'">
    <xsl:variable name="prefix" select=""/>
  </xsl:if>

  <xs:complexType name="{concat($prefix, @name)}">
    <xsl:apply-templates select="node()" />
  </xs:complexType>
  <xsl:apply-templates select=".//xs:element" />
</xsl:template>

这个想法是,如果前缀变量值是“核心”,我不希望它被添加到name属性值。任何其他价值,我想加入。 IE:

<xs:complexType name="coreBirthType">

... 可接受,而以下是:

<xs:complexType name="BirthType">

但我必须允许这种情况发生:

<xs:complexType name="AcRecHighSchoolType">

我在一个区块中尝试了这个,但是撒克逊抱怨没有找到一个结束节点:

<xsl:choose>
  <xsl:when test="starts-with(.,'core')">
    <xs:complexType name="{@name)}">
  </xsl:when>
  <xsl:otherwise>
    <xs:complexType name="{concat($prefix, @name)}">
  </xsl:otherwise>
</xsl:choose>
  <xsl:apply-templates select="node()" />
</xs:complexType>

处理此问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:5)

在XSLT中,作为一种没有副作用的纯语言,变量是不可变的。您无法更改变量值。如果您使用相同的名称声明另一个<xsl:variable>,则定义一个隐藏旧变量的新变量。

以下是您可以这样做的方法:

<xsl:param name="prefix" />

<xsl:variable name="prefix-no-core">
  <xsl:if test="$prefix != 'core'">
    <xsl:value-of select="$prefix" />
  </xsl:if>
</xsl:variable>

<xs:complexType name="{concat($prefix-no-core, @name)}">
...

答案 1 :(得分:1)

好吧,你可以在变量中使用if;但在这种情况下,我想我会尝试<xsl:attribute>

<xs:complexType>
   <xsl:attribute name="name"><xsl:if test="$prefix != 'core'"><xsl:value-of select-"$prefix"/></xsl:if><xsl:value-of select="@name"/></xsl:attribute>
   <!-- etc -->
</xs:complexType>

if方法:

<xsl:variable name="finalPrefix"><xsl:if test="$prefix != 'core'"><xsl:value-of select="$prefix"/></xsl:if></xsl:variable>
...
<xs:complexType name="{$finalPrefix}{@name}">
  <!-- etc -->
</xs:complexType>