XSLT:测试参数以了解它是否已设置

时间:2009-07-13 16:47:17

标签: xslt

我有一种情况,即param不会被设置,但我尝试捕获&处理参考不起作用。

我正在使用以下内容:

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

  <xsl:variable name="prefix-no-core">
    <xsl:choose>
      <!-- if no value, default to 'AcRec' -->
      <xsl:when test="not($prefix)"> 
        <xsl:value-of select="'AcRec'" />
      </xsl:when>
      <!-- if 'core', leave as empty string -->
      <xsl:when test="$prefix = 'core'">
      </xsl:when>
      <!-- if 'AcRec', set the value -->
      <xsl:when test="$prefix = 'AcRec'">
        <xsl:value-of select="$prefix" />
      </xsl:when>               
    </xsl:choose>
  </xsl:variable>

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

我在第一次测试中也尝试过$ prefix ='' - 两种方法都没有效果。但如果我使用:

<xsl:value-of select="not($prefix)" />

...值打印为true。但是在我的xsl:choose中使用它不会产生任何输出。

4 个答案:

答案 0 :(得分:8)

您可以为参数指定默认值,当它未通过时,您可以检查它。

虽然在你的例子中,看起来只是有一个默认值会大大简化事情。

<xsl:template match="xs:complexType">
  <xsl:param name="prefix" select="'default-value'" /> <!-- SET default -->

  <xsl:variable name="prefix-no-core">
    <xsl:choose>
      <!-- if no value, default to 'AcRec' -->
      <xsl:when test="$prefix = 'default-value'"> 
        <xsl:value-of select="'AcRec'" />
      </xsl:when>
      <!-- if 'core', leave as empty string -->
      <xsl:when test="$prefix = 'core'">
      </xsl:when>
      <!-- if 'AcRec', set the value -->
      <xsl:when test="$prefix = 'AcRec'">
        <xsl:value-of select="$prefix" />
      </xsl:when>                       
    </xsl:choose>
  </xsl:variable>

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

这样调用,值为'default-value':

<xsl:apply-templates select="//xs:complexType[@name='AddressType']" />

这样调用,值为'pass-value':

<xsl:apply-templates select="//xs:complexType[@name='AddressType']">
    <xsl:with-param name="prefix" value="'passed-value'"/>
</xsl:apply-templates>

编辑:为了完整起见,原始示例的简化形式为:

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

  <xsl:variable name="prefix-no-core">
    <xsl:choose>
      <!-- if 'core', leave as empty string -->
      <xsl:when test="$prefix = 'core'">
      </xsl:when>
      <!-- defaults to 'AcRec' -->
      <xsl:otherwise>
        <xsl:value-of select="$prefix" />
      </xsl:otherwise>                       
    </xsl:choose>
  </xsl:variable>

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

答案 1 :(得分:1)

注意:替换旧答案,如果需要,请查看历史记录。

以下输入:

<test xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:complexType name="something"/>
    <xs:complexType name="somethingElse"/>
</test>

加入以下XSLT:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0">
    <xsl:template match="/">
        <xsl:for-each select="node()">
            <xsl:apply-templates/>
        </xsl:for-each>
    </xsl:template>

    <xsl:template match="xs:complexType">
        <xsl:param name="prefix" />
        <xsl:variable name="prefix-no-core">
            <xsl:choose>
                <xsl:when test="not($prefix)">AcRec</xsl:when>
                <xsl:when test="$prefix = 'core'"/>
                <xsl:when test="$prefix = 'AcRec'">AcRec</xsl:when>                       
            </xsl:choose>
        </xsl:variable>

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

给出以下结果:

<xs:complexType name="AcRecsomething" xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
<xs:complexType name="AcRecsomethingElse" xmlns:xs="http://www.w3.org/2001/XMLSchema"/>

我不确定你还在寻找什么...

答案 2 :(得分:1)

这是一个黑客攻击,但我在测试空参数之前首先使用normalize-space()函数包装参数取得了成功。

<xsl:value-of select="not(normalize-space($prefix))" />

答案 3 :(得分:0)

在迄今为止提出的建议中,唯一有效的解决方案是在调用模板时始终设置参数值。例如,以前我曾经:

<xsl:apply-templates select="//xs:complexType[@name='AddressType']" />

这必须改为:

<xsl:apply-templates select="//xs:complexType[@name='AddressType']">
  <xsl:with-param name="prefix" select="'AcRec'" />
</xsl:apply-templates>

我真的很想知道为什么不($ param)和$ param =''在WHEN测试中不起作用,但我可以在xsl:value-of中得到not($ param)的值言。