我的代码如下所示,它给出了样式表编译错误。
<xsl:template match="form">
<xsl:copy>
<xsl:for-each select="@*">
<xsl:variable name="param" select="name(.)" />
<xsl:choose>
<xsl:when test="$param = 'name'">
<xsl:attribute name="name"><xsl:value-of
select="@name" /></xsl:attribute>
</xsl:when>
<xsl:when test="$param = 'action'">
<xsl:attribute name="action"><xsl:value-of
select="java:com.hp.cpp.proxy.util.URLUtils.rewriteAction($response, $baseurl, @action, $scope)" /></xsl:attribute>
</xsl:when>
<xsl:when test="$param = 'method'">
<xsl:attribute name="method">POST</xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="$param"><xsl:value-of
select="." /></xsl:attribute>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
<input type="hidden" name="httpmethod">
<xsl:attribute name="value"> <xsl:value-of
select="@method" /></xsl:attribute>
</input>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
我正在尝试重写HTML的FORM标签,但要求非常复杂。希望你能通过代码快照识别出来。我试图只重写标签的一些属性,并试图保留其余的。这是正确的方法吗?还有其他办法吗?任何建议。
提前致谢。
-Rikin
答案 0 :(得分:0)
只是一个猜测。尝试替换最后一次申请
<xsl:apply-templates select="node()|@*" />
由此
<xsl:apply-templates select="node()" />
答案 1 :(得分:0)
关于编译错误,您没有提供足够的信息来提供帮助; Abel猜想编译错误与你对扩展函数的调用有关是合理的。
你也问这是正确的方法吗?来实现你的目标。也许。你的第一个问题是jvverde已经指出的逻辑错误。应用模板的调用不应该选择属性;你已经处理了所有的属性。所以没有必要再次处理它们。这也是一个坏主意:如果你尝试再次处理form
元素的属性,你会得到一个运行时错误,因为你已经向元素写了内容(即input
元素)。
我认为一些XSLT程序员会写一些看起来更像是这样的东西:
<xsl:template match="form">
<xsl:copy>
<!--* don't use a for-each to handle the
* attributes; use templates. *-->
<xsl:apply-templates select="@*"/>
<!--* you don't need an xsl:attribute constructor
* if you want to use an expression within a
* literal result element; just braces in the
* attribute-value template.
*-->
<input type="hidden"
name="httpmethod"
value="{@method}" />
<!--* change your apply-templates call to
* select children, but not attributes.
*-->
<xsl:apply-templates select="node()" />
</xsl:copy>
</xsl:template>
<!--* now the attributes ... *-->
<xsl:template match="form/@action">
<xsl:attribute name="action">
<xsl:value-of select="java:com.hp.cpp.proxy.util.URLUtils.rewriteAction(
$response, $baseurl, @action, $scope)" />
</xsl:attribute>
</xsl:template>
<xsl:template match="form/@method">
<xsl:attribute name="method">
<xsl:value-of select="'POST'"/>
</xsl:attribute>
</xsl:template>