我正在尝试为两种情况进行匹配:
- 字符串包含数字以外的字符
- 字符串包含超过 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) < 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>
但是,正如我在氧气中所说,我收到错误:
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 以支持这些选项。
,您收到的是警告,而不是错误。如果您想避免警告,请决定哪个模板应该具有更高的优先级并设置它,例如 根据需要<xsl:template match="foo" priority="5"/>
。
XSLT 规范规定,如果节点与具有相同优先级的多个模板规则匹配,则为"可恢复错误"。允许实现忽略错误并选择最后出现的模板,或者允许将其视为硬错误。Saxon 允许通过命令行参数选择这些选项中的任何一个,但默认情况下,它选择一个中间选项,即报告警告并继续。
我建议您在收到此警告时检查这两个规则,并确定要优先处理其中哪一条规则。然后为两个规则提供显式优先级属性,这样就不会有歧义。
我不确定这是否有效,但请尝试在第一个模板匹配中添加对长度的相反检查
<xsl:template match="record
[translate(employeeNumber, 'abcdefghijklmnopqrstuvwxyzABCDEFGHILKLMNOIPQRSTUVWXYZ!£$%^', '')]
[string-length(employeeNumber) >= 9]"/"/>
<xsl:template match="record[string-length(employeeNumber) < 9]"/>
这是一点重复的编码,但它们现在应该不匹配相同的记录。