7

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

  1. 字符串包含除数字以外的字符
  2. 字符串超过 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>

这是应该返回的:

<?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 以支持这些选项。

4

3 回答 3

10

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

于 2012-05-10T15:49:21.490 回答
10

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

我建议当您收到此警告时,检查这两条规则并决定要优先考虑其中的哪条。然后给两个规则明确的优先级属性,这样就不会有歧义。

于 2012-05-10T21:32:41.057 回答
1

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

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

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

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

于 2012-05-10T19:18:41.453 回答