2012-05-10 4 views
4

Я пытаюсь сделать матч для двух сценариев:XSLT Ошибка производства «Неоднозначное правило матча»

  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 I я получаю ошибку:

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 для поддержки этих параметров.

ответ

6

Мне кажется, что вы получаете предупреждение, а не ошибку. Если вы хотите избежать предупреждения, то решите, какой шаблон должен иметь более высокий приоритет и установить его, например. <xsl:template match="foo" priority="5"/> по мере необходимости.

+0

ОК, так что это не должно повлиять на функциональность XSLT на самом деле? Причина, по которой я говорю, заключается в том, что Oxygen не производит выход и просто вызывает предупреждение. – MMKD

1

Я не уверен, если это будет работать, но попробуйте добавить противоположную проверку на длину в первом матче шаблона

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

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

Это немного дубликата кодирования, но они теперь должны не соответствовать тем же запись.

7

Спецификация XSLT говорит, что это «восстанавливаемая ошибка», если узел соответствует более чем одному правилу шаблона с тем же приоритетом. Реализациям разрешено игнорировать ошибку и выбирать какой бы ни был шаблон последним, или им разрешено рассматривать его как жесткую ошибку. Saxon позволяет выбрать один из этих параметров с помощью параметра командной строки, но по умолчанию он выбирает средние опции, которые должны сообщать о предупреждении и продолжать.

Я бы рекомендовал, чтобы при получении этого предупреждения вы изучили два правила и определили, какой из них вы хотите первоочередно. Затем дайте оба правила явным атрибутам приоритета, чтобы не было двусмысленности.

Смежные вопросы