XSLT错误产生“模糊规则匹配”

时间:2012-05-10 15:02:12

标签: xslt match

我正在尝试为两种情况进行匹配:

  1. 字符串包含的字符不仅仅是数字
  2. 字符串超过8个字符。
  3. 所以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>
    

    这是应该返回的内容:

    <?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>
    

    然而正如我在Oxygen中所说,我得到了错误:

    Severity: warning Description: Ambiguous rule match for /request[1]/records[1]/record[1] Matches both "record[string-length(employeeNumber) < 9]" on line 13 of file:/C:/Users/mdown/Desktop/Untitled21.xsl and "record[translate(employeeNumber, 'abcdefghijklmnopqrstuvwxyzABCDEFGHILKLMNOIPQRSTUVWXYZ!£$%^', '')]" on line 12 of file:/C:/Users/mdown/Desktop/Untitled21.xsl

    之所以这样,是因为它匹配两个规则,但这应该不是问题。我如何改变XSLT以支持这些选项。

3 个答案:

答案 0 :(得分:9)

在我看来,好像你收到警告,而不是错误。如果你想避免警告,那么决定哪个模板应该具有更高的优先级并设置例如<xsl:template match="foo" priority="5"/>根据需要。

答案 1 :(得分:9)

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

我建议您在收到此警告时,检查这两个规则并确定要优先考虑哪些规则。然后给两个规则显式优先级属性,这样就没有歧义。

答案 2 :(得分:1)

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

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

<xsl:template match="record[string-length(employeeNumber) &lt; 9]"/> 

这有点重复编码,但它们现在应该不匹配相同的记录。