你好,我有一个看起来像这样的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!£$%^', '')]" priority="1"/>
<xsl:template match="record[string-length(employeeNumber) < 8]" priority="2"/>
</xsl:stylesheet>
正如您所看到的,匹配条件不得包含字母或特殊字符,并且大于8个字符。所以当我使用这个XML时:
<?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:
<?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>
HOWEVER 它会实际返回:
<?xml version="1.0" encoding="UTF-8"?>
<request>
<records/>
</request>
为什么不匹配:
答案 0 :(得分:1)
使用此
<xsl:template match="record[string-length(employeeNumber) <= 8]
[translate(employeeNumber, '0123456789', '') = '']
" />
答案 1 :(得分:1)
这个怎么样
<xsl:template match="record[
not(
string-length(employeeNumber) >= 8
and
translate(employeeNumber, '0123456789', '') = ''
)
]" />
您不需要两个模板,也不需要此任务的模板优先级。
以上产生:
<request>
<records>
<record>
<employeeNumber>12345678</employeeNumber>
</record>
<record>
<employeeNumber>123456789</employeeNumber>
</record>
</records>
</request>
符合您的要求
答案 2 :(得分:0)
字符串长度(employeeNumber)&lt; 8模板永远不会匹配,因为您的员工编号都没有字符串长度小于8。
translate()模板匹配所有记录,因为所有员工编号至少包含一个字符(数字),而翻译()不会消除。 (因此,translate的结果是非空字符串,其布尔值为true)。
(注意:Saxon有一个选项-T,它跟踪哪些元素与哪些模板规则相匹配。这对调试此类事物非常有用)