2016-05-03 1 views
0

Я хотел бы разметить строку, представляющую формат даты, как DD/MM/YYYY во многих элементов, таких как DD, /, MM, /, YYYY и петли на них для того, чтобы превратитьКак я могу зацикливать на токенах строки в XSLT 1.0?

<tag date-format="DD/MM/YYYY" /> 

в

<container> 
    <number:day number:style="long" /> 
    <number:text>/</number:text> 
    <number:month number:style="long" /> 
    <number:text>/</number:text> 
    <number:year number:style="long" /> 
</container> 

Следовательно, тег

<tag date-format="MM-DD-YYYY" /> 

должны быть преобразованы в

<container> 
    <number:month number:style="long" /> 
    <number:text>-</number:text> 
    <number:day number:style="long" /> 
    <number:text>-</number:text> 
    <number:year number:style="long" /> 
</container> 

Я не имею ни малейшего представления, как это сделать в XSLT 1.0 без поддержки токенизаторов и регулярных выражений.

Пожалуйста, учтите Я привязан к XSLT 1.0 и не могу обновить.

ответ

1

Попробуйте это в качестве отправной точки:

<xsl:template match="tag[@date-format]"> 
    <container> 
     <xsl:call-template name="analyze-date-format"> 
      <xsl:with-param name="date-format" select="@date-format" /> 
     </xsl:call-template> 
    </container> 
</xsl:template> 

<xsl:template name="analyze-date-format"> 
    <xsl:param name="date-format"/> 
    <xsl:variable name="separators" select="translate($date-format, 'YMD', '')" /> 
    <xsl:variable name="separator" select="substring($separators, 1, 1)" /> 
    <xsl:variable name="token"> 
     <xsl:choose> 
      <xsl:when test="$separator"> 
       <xsl:value-of select="substring-before($date-format, $separator)" /> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="$date-format" /> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:variable> 
    <xsl:choose> 
     <xsl:when test="$token = 'YYYY'"> 
      <number:year number:style="long" /> 
     </xsl:when> 
     <xsl:when test="$token = 'MM'"> 
      <number:month number:style="long" /> 
     </xsl:when> 
     <xsl:when test="$token = 'DD'"> 
      <number:day number:style="long" /> 
     </xsl:when> 
    </xsl:choose> 
    <xsl:if test="$separators"> 
     <number:text> 
      <xsl:value-of select="$separator" /> 
     </number:text> 
     <!-- recursive call --> 
     <xsl:call-template name="analyze-date-format"> 
      <xsl:with-param name="date-format" select="substring-after($date-format, $separator)" /> 
     </xsl:call-template> 
    </xsl:if> 
</xsl:template> 

Это предполагает, что все маркеры находятся в верхнем регистре (и, возможно, некоторые другие презумпций тоже). Вероятно, вы захотите добавить дополнительные тесты для дополнительных типов токенов.

Обратите внимание, что префикс number: должен быть привязан к пространству имен!

+0

Это было действительно блестящее решение, оно работало как шарм! – Max