-1

您好,我有一个看起来像这样的 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>

但是它实际上返回:

<?xml version="1.0" encoding="UTF-8"?>
<request>
    <records/>
</request>

为什么比赛不是:

  1. 只寻找字母
  2. 不使用超过 8 个字符的第二个匹配项?
4

3 回答 3

1

用这个

<xsl:template match="record[string-length(employeeNumber) &lt;= 8]
                           [translate(employeeNumber, '0123456789', '') = '']
" />
于 2012-05-11T10:42:14.530 回答
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 个字符
于 2012-05-11T10:45:00.553 回答
0

string-length(employeeNumber) < 8 模板永远不会匹配,因为您的员工编号中没有一个字符串长度小于 8。

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

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

于 2012-05-11T11:47:30.890 回答