XSL:选择查询

时间:2013-08-20 12:09:19

标签: xslt xslt-1.0 xslt-2.0

我的代码如下所示,它给出了样式表编译错误。

<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

2 个答案:

答案 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>