我想使用XSLT 2.0(Saxon 9.1.0.7)在源xml文件中处理 frame 元素。如果 frame 元素包含渲染器属性,我需要将其从 frame 模板发送到另一个命名模板,否则我想发送一个默认渲染器值到命名模板。
所以在源xml文件中我可以有以下内容,在这种情况下,我想将一个默认值作为参数发送到命名模板:
<frame id="menu_frame_1">
或者,如果在源xml doc中定义了渲染器属性,那么我想发送它而不是默认值:
<frame id="menu_frame_1" renderer="KONtx.element.Container">
我遇到的问题是我不知道如何有条件地选择默认属性或已定义属性(如果存在)并将其传递给命名模板。我尝试在调用模板中使用 xsl:choose ,但这是不允许的。另外,我会在调用模板之外移动选择,并使用默认值或属性值设置变量,但变量是不可变的,所以我不知道如何处理这种情况。下面是 frame 元素的模板,以及我试图调用的命名模板。任何帮助表示赞赏。感谢。
<xsl:template match="frame">
<!-- Call new object start named template below -->
<xsl:call-template name="newObjectStart">
<xsl:with-param name="id"><xsl:value-of select="@id" /></xsl:with-param>
<xsl:choose>
<xsl:when test="@renderer">
<xsl:with-param name="renderer">
<xsl:value-of select="@renderer" />
</xsl:with-param>
</xsl:when>
<xsl:otherwise>
<xsl:with-param name="renderer">KONtx.element.Container</xsl:with-param>
</xsl:otherwise>
</xsl:choose>
</xsl:call-template>
...
</xsl:template>
<!-- New Object Start Named Template -->
<xsl:template name="newObjectStart">
<xsl:param name="id" />
<xsl:param name="renderer" />
<xsl:text>var </xsl:text>
<xsl:value-of select="$id" />
<xsl:text> = </xsl:text>
<xsl:text>new </xsl:text>
<xsl:value-of select="$renderer" />
<xsl:text>({</xsl:text>
</xsl:template>
答案 0 :(得分:1)
您必须将<xsl:choose>
放在<xsl:with-param>
内而不是外面。
<xsl:template match="frame">
<!-- Call new object start named template below -->
<xsl:call-template name="newObjectStart">
<xsl:with-param name="id">
<xsl:value-of select="@id" />
</xsl:with-param>
<xsl:with-param name="renderer">
<xsl:choose>
<xsl:when test="@renderer">
<xsl:value-of select="@renderer" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="'KONtx.element.Container'" />
</xsl:otherwise>
</xsl:choose>
</xsl:with-param>
</xsl:call-template>
...
</xsl:template>
答案 1 :(得分:0)
试试这个
<xsl:choose>
<xsl:when test="@renderer">
<xsl:call-template name="newObjectStart">
<xsl:with-param name="id"><xsl:value-of select="@id" /></xsl:with-param>
<xsl:with-param name="renderer"><xsl:value-of select="@renderer" /></xsl:with-param>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="newObjectStart">
<xsl:with-param name="id"><xsl:value-of select="@id" /></xsl:with-param>
<xsl:with-param name="renderer">KONtx.element.Container</xsl:with-param>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:call-template>
...