我有一种情况,即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中使用它不会产生任何输出。
答案 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)的值言。