XSLT错误输出匹配包含字母的记录

时间:2012-05-11 10:32:03

标签: xml xslt

你好,我有一个看起来像这样的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) &lt; 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>

为什么不匹配:

  1. 只找信件
  2. 不使用超过8的字符的第二个匹配?

3 个答案:

答案 0 :(得分:1)

使用此

<xsl:template match="record[string-length(employeeNumber) &lt;= 8]
                           [translate(employeeNumber, '0123456789', '') = '']
" />

答案 1 :(得分:1)

这个怎么样

<xsl:template match="record[
  not(
    string-length(employeeNumber) &gt;= 8
    and
    translate(employeeNumber, '0123456789', '') = ''
  )
]" />

您不需要两个模板,也不需要此任务的模板优先级。

以上产生:

<request>
  <records>
    <record>
      <employeeNumber>12345678</employeeNumber>
    </record>
    <record>
      <employeeNumber>123456789</employeeNumber>
    </record>
  </records>
</request>

符合您的要求

  • 不得包含字母或特殊字符
  • 不得少于8个字符

答案 2 :(得分:0)

字符串长度(employeeNumber)&lt; 8模板永远不会匹配,因为您的员工编号都没有字符串长度小于8。

translate()模板匹配所有记录,因为所有员工编号至少包含一个字符(数字),而翻译()不会消除。 (因此,translate的结果是非空字符串,其布尔值为true)。

(注意:Saxon有一个选项-T,它跟踪哪些元素与哪些模板规则相匹配。这对调试此类事物非常有用)