撒克逊XSLT 2.0投射错误对我来说没有意义

时间:2015-11-13 09:10:57

标签: html xml xslt saxon

我正在尝试进行简单的转换。 proccessor报告的错误是:无法在包含元素的子元素之后创建属性节点(名称)。错误指向此行<xsl:apply-templates select="@*|node()"/>到最后一个模板。< / p>

编辑#1: 这是输入:

<root>
    <processor>../../library/saxon-he-9-6-0-7j/saxon9he.jar</processor>
    <test-case name="test-case-1">
        <object-under-test category="template" name="text-align"/>
        <parameters>
            <input name="text">text</input>
            <input name="min-lenght">8</input>
            <input name="align">left</input>
            <output name="result"/>
        </parameters>
        <criteria>
            <criterion class="equal" to="'text    '"/>
        </criteria>
    </test-case>
</root>

这是XSL:

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xslAlt="dummy" version="1.0">
    <xsl:namespace-alias stylesheet-prefix="xslAlt" result-prefix="xsl"/>
    <!--~~~-->
    <xsl:template match="root">
        <xslAlt:stylesheet version="1.0">
            <xslAlt:output method="xml"/>
            <xslAlt:include href="../../../product/templates.xsl"/>
            <xslAlt:template name="root" match="/">
                <xsl:apply-templates select="test-case"/>
            </xslAlt:template>
        </xslAlt:stylesheet>
    </xsl:template>
    <!--~~-->
    <xsl:template match="test-case">
        <test-case name="{concat('test-case-', string(position()))}">
            <xsl:variable name="test-case-return" select="concat('test-case-',string(position()),'-return')"/>
            <xslAlt:variable name="{$test-case-return}">
                <xslAlt:call-template name="{object-under-test/@name}">
                    <xsl:for-each select="parameters/input">
                        <xsl:choose>
                            <xsl:when test="string(number()) = 'NaN'">
                                <xslAlt:with-param name="{@name}" select="'{.}'"/>
                            </xsl:when>
                            <xsl:otherwise>
                                <xslAlt:with-param name="{@name}" select="{.}"/>
                            </xsl:otherwise>
                        </xsl:choose>
                    </xsl:for-each>
                </xslAlt:call-template>
            </xslAlt:variable>
            <!--~~-->
            <xslAlt:variable name="result" select="translate(${$test-case-return},{string('$space')},{string('$nbsp')})"/>
            <xsl:apply-templates select="@*|node()"/>
        </test-case>
    </xsl:template>
    <!--~~-->
    <xsl:template match="criteria">
        <criteria>
            <xslAlt:variable name="test-result">
                <xslAlt:choose>
                    <xslAlt:when test="{translate(criterion/@to,'&#32;','&#160;')} = $result">TEST-PASSED</xslAlt:when>
                    <xslAlt:otherwise>TEST-FAILED</xslAlt:otherwise>
                </xslAlt:choose>
            </xslAlt:variable>
            <xsl:apply-templates select="@*|node()"/>
        </criteria>
    </xsl:template>
    <!--~~-->
    <xsl:template match="@to">
        <xsl:attribute name="to">
            <xsl:value-of select="translate(.,'&#32;','&#160;')"/>
            <!--translate  replace-->
        </xsl:attribute>
        <xsl:attribute name="result">{<xsl:value-of select="string('$test-result')"/></xsl:attribute>
    </xsl:template>
    <!--~~-->
    <xsl:template match="parameters/output">
        <output name="{@name}">
            <xslAlt:value-of select="$result"/>
        </output>
    </xsl:template>
    <!--~~-->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/><!--THE ERROR IS POINTING HERE!!!-->
        </xsl:copy>
    </xsl:template>
    <!--~~-->
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:2)

  

proccessor报告的错误是:属性节点(名称)   无法在包含元素的子元素之后创建。

这不是“投射错误”。它说的是你在创建一些孩子后尝试创建一个属性。

AFAICT,它发生在这里:

<xsl:template match="test-case">
    <test-case name="{concat('test-case-', string(position()))}">

        <!--here child nodes are being created!!! ~-->

        <xsl:apply-templates select="@*|node()"/>
    </test-case>
</xsl:template>

如果你改变(第35行):

<xsl:apply-templates select="@*|node()"/>

为:

<xsl:apply-templates select="node()"/>

错误将消失,因为现在它将停止尝试复制现有属性。你不希望这种情况发生,因为它会覆盖你自己创建的name属性。

<强>买者
我没有仔细检查你的样式表。