2016-12-14 3 views
0

Я пишу таблицу стилей, чтобы создать отчет, по которому текстовые строки в файле больше, чем разрешено. (Насколько известно, это невозможно сделать с помощью схемы 1.0.)Использование длины строки, указанной в элементе для проверки другого элемента

Для каждого текста я проверяю, что длина строки, содержащейся в элементе Value, не превышает того, что указано в элементе Info для этого конкретный текст.

Однако я обнаружил, что моя переменная maxLength не может использоваться как глобальная переменная. Поэтому, хотя я могу получить информацию о максимальных длинах, я не могу использовать эти значения в своих проверках. Я мог бы посоветовать, как лучше перепроектировать мою таблицу стилей.

Мой XSL:

<?xml version='1.0'?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 
    <!-- Message template --> 
    <xsl:template match="Text" > 
     <xsl:variable name="messageNumber" select="@Id"/> 
     <xsl:variable name="maxLength"/> 

     <xsl:choose> 
      <xsl:when test="(normalize-space(Info)='')"> 
       <xsl:variable name="maxLength" select="40" /> 
       Message <xsl:value-of select="$messageNumber"/> is missing Max Length. Using <xsl:value-of select="$maxLength"/> 
      </xsl:when> 
      <xsl:when test="contains(Info,'char')"> 
       <xsl:variable name="maxLength1" select="substring-before(Info, 'char')"/> 
       <xsl:variable name="maxLength" select="substring($maxLength1, string-length($maxLength1) - 2)" /> 
      </xsl:when> 
      <xsl:otherwise></xsl:otherwise> 
     </xsl:choose> 

     <xsl:choose>  
      <xsl:when test="string-length(Value) &gt; $maxLength"> 
       Message <xsl:value-of select="$messageNumber"/> too long: <xsl:value-of select="string-length(Value)"/> chars (max is <xsl:value-of select="$maxLength"/>) 
      </xsl:when> 
      <xsl:otherwise> 
       Message <xsl:value-of select="$messageNumber"/> is OK: <xsl:value-of select="string-length(Value)"/> chars (max is <xsl:value-of select="$maxLength"/>) 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 

Мой XML:

<?xml version="1.0" ?> 
<Texts> 
    <Text Id="1"> 
    <Value>OK</Value> 
    <Info>Text length for button, max 6 chars</Info> 
    </Text> 
    <Text Id="2"> 
    <Value>Cancel</Value> 
    <Info>Button, Maximum length 9 chars</Info> 
    </Text> 
    <Text Id="3"> 
    <Value>Continue</Value> 
    <Info>This text cannot be longer than 14 characters. Use short form if required.</Info> 
    </Text> 
    <Text Id="4"> 
    <Value>Twinkle, twinkle little star</Value> 
    <Info>Title text, Maximum length 14 chars.</Info> 
    </Text> 
    <Text Id="5"> 
    <Value>Twinkle, twinkle little star again</Value> 
    <Info></Info> 
    </Text> 
</Texts> 

Нужный выход что-то вроде этого:

Message 1 is OK: 2 chars (max is 6) 
Message 2 is OK: 6 chars (max is 9) 
Message 3 is OK: 8 chars (max is 14) 
Message 4 too long: 28 chars (max is 14) 
Message 5 is missing Max Length. Using 40 
Message 5 is OK: 34 chars (max is 40) 

ответ

0

Переменные в XSLT неизменны, и не может быть изменен один раз задавать. То, что делает ваш XSLT, это инициализация новой переменной с именем maxLength в операциях xsl:when, которая является локальной по объему для этого блока (говорят, что «теневая» основная переменная).

Что нужно сделать, чтобы иметь отдельные инструкции для инициализации maxLength и для отображения сообщения.

Попробуйте XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 
    <!-- Message template --> 
    <xsl:template match="Text" > 
     <xsl:variable name="messageNumber" select="@Id"/> 

     <xsl:variable name="maxLength"> 
      <xsl:choose> 
       <xsl:when test="(normalize-space(Info)='')">40</xsl:when> 
       <xsl:when test="contains(Info,'char')"> 
        <xsl:variable name="maxLength1" select="substring-before(Info, 'char')"/> 
        <xsl:value-of select="substring($maxLength1, string-length($maxLength1) - 2)" /> 
       </xsl:when> 
      </xsl:choose> 
     </xsl:variable> 

     <xsl:if test="(normalize-space(Info)='')"> 
      Message <xsl:value-of select="$messageNumber"/> is missing Max Length. Using <xsl:value-of select="$maxLength"/> 
     </xsl:if> 

     <xsl:choose>  
      <xsl:when test="string-length(Value) &gt; $maxLength"> 
       Message <xsl:value-of select="$messageNumber"/> too long: <xsl:value-of select="string-length(Value)"/> chars (max is <xsl:value-of select="$maxLength"/>) 
      </xsl:when> 
      <xsl:otherwise> 
       Message <xsl:value-of select="$messageNumber"/> is OK: <xsl:value-of select="string-length(Value)"/> chars (max is <xsl:value-of select="$maxLength"/>) 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 
Смежные вопросы