Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
生成XSLT错误“0”;“不明确的规则匹配”;_Xslt_Match - Fatal编程技术网

生成XSLT错误“0”;“不明确的规则匹配”;

生成XSLT错误“0”;“不明确的规则匹配”;,xslt,match,Xslt,Match,我尝试对两种情况进行匹配: 字符串包含除数字以外的字符 字符串的长度超过8个字符 因此XSLT是: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:strip-space elements="*"/>

我尝试对两种情况进行匹配:

  • 字符串包含除数字以外的字符
  • 字符串的长度超过8个字符
  • 因此XSLT是:

    <xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output omit-xml-declaration="yes" indent="yes"/>
        <xsl:strip-space elements="*"/>
    
        <xsl:template match="node()|@*">
            <xsl:copy>
                <xsl:apply-templates select="node()|@*"/>
            </xsl:copy>
        </xsl:template>
    
        <xsl:template match="record[translate(employeeNumber, 'abcdefghijklmnopqrstuvwxyzABCDEFGHILKLMNOIPQRSTUVWXYZ!£$%^', '')]"/>
        <xsl:template match="record[string-length(employeeNumber) &lt; 9]"/>
    </xsl:stylesheet>
    
    
    
    测试数据为:

    <?xml version="1.0" encoding="UTF-8"?>
    <request>
        <records>
            <record>
                <employeeNumber>12345678</employeeNumber>
            </record>
            <record>
                <employeeNumber>1234567A</employeeNumber>
            </record>
            <record>
                <employeeNumber>12345678A</employeeNumber>
            </record>
            <record>
                <employeeNumber>123456789</employeeNumber>
            </record>
        </records>
    </request>
    
    
    12345678
    1234567A
    12345678A
    123456789
    
    这是应该退还的:

    <?xml version="1.0" encoding="UTF-8"?>
    <request>
        <records>
            <record>
                <employeeNumber>1234567A</employeeNumber>
            </record>
            <record>
                <employeeNumber>12345678A</employeeNumber>
            </record>
            <record>
                <employeeNumber>123456789</employeeNumber>
            </record>
        </records>
    </request>
    
    
    1234567A
    12345678A
    123456789
    
    然而,正如我在《氧气》中所说,我得到了一个错误:

    严重性:警告
    描述:与/request[1]/records[1]/record[1]的规则匹配不明确
    匹配文件:/C:/Users/mdown/Desktop/Untitled21.xsl第13行的“record[string length(employeeNumber)<9]”
    和“在文件:/C:/Users/mdown/Desktop/Untitled21.xsl的第12行记录[翻译(员工编号,'abcdefghijklmnopqrstuvxyzabcdefghilklmnoipqrstuvxyz!£$%^',''”)”


    这样做的原因是因为它与两个规则都匹配,但是这应该不是问题。如何更改XSLT以支持这些选项。

    在我看来,您似乎收到了警告,而不是错误。如果要避免出现警告,请决定哪个模板应具有更高的优先级,并根据需要进行设置,例如

    我不确定这是否有效,但请尝试在第一个模板匹配中添加长度的相反检查

    <xsl:template match="record
           [translate(employeeNumber, 'abcdefghijklmnopqrstuvwxyzABCDEFGHILKLMNOIPQRSTUVWXYZ!£$%^', '')]
           [string-length(employeeNumber) &gt;= 9]"/"/> 
    
    <xsl:template match="record[string-length(employeeNumber) &lt; 9]"/> 
    

    XSLT规范指出,如果一个节点匹配多个具有相同优先级的模板规则,则这是一个“可恢复的错误”。允许实现忽略错误并选择最后一个模板,或者允许它们将其视为硬错误。Saxon允许通过命令行参数选择这两个选项中的任何一个,但默认情况下,它选择一个中间选项,即报告警告并继续


    我建议您在收到此警告时,检查这两条规则,并决定优先考虑哪一条。然后为这两个规则提供明确的优先级属性,这样就不会产生歧义。

    OK,这样就不会影响XSLT的实际功能了?我之所以这么说,是因为氧气不会产生输出,只是发出警告。