Как поменять формат даты в XSLT? - PullRequest
1 голос
/ 18 ноября 2009

Я работаю над сайтом. На этом сайте некоторые страницы получают данные из XML через XSLT. Но дата отображается в виде ГГГГ-ММ-ДД, который в идеале берется из XML, который был в этом формате. Я хотел бы преобразовать этот формат в DD-MM-YYYY через XSLT или каким-либо другим возможным способом.

Пожалуйста, предложите мне идею, чтобы продолжить или предоставить мне код для достижения этого как можно скорее. Это формат предоставления XML

 <published date="2009-09-28T07:06:00 CET" />

и я хочу преобразовать это в

 <published date="28-09-2009T07:06:00 CET" />

и это xsl файл

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <html>
      <body>
        <table class="bdr-bot" width="100%" border="0" cellspacing="0" cellpadding="0" style="clear:both">
          <tr>
            <th width="15%" class="bdr">Date</th>
            <th class="bdr">Title</th>
          </tr>
          <xsl:for-each select="hexML/body/press_releases/press_release">
          <xsl:if test="contains(published/@date, '2009')">
            <tr>
              <td valign="top">
                <xsl:value-of select="substring-before(published/@date, 'T')"/>
              </td>
              <td valign="top">
              <a href="result-page.aspx?ResultPageURL={location/@href}"><xsl:value-of select="headline"/></a>
              </td>
            </tr>
            </xsl:if>
          </xsl:for-each>
        </table>
      </body>
    </html>
  </xsl:template>

Теперь скажите мне решение? это возможно с fn: reverse ?

Ответы [ 4 ]

3 голосов
/ 18 ноября 2009

Если XML имеет формат YYYY-MM-DD, вы сможете использовать функцию Xpath tokenize, чтобы разбить вашу строку там, где происходит -, и затем изменить ее порядок. Что-то похожее на:

<xsl:variable name="dt" value="tokenize(Date, '-')"/>
<xsl:value-of select="concat(dt[3],'-',dt[2],'-',dt[1])"/>

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

2 голосов
/ 18 ноября 2009

Предполагая

<xml>
  <date>2009-11-18</date>
</xml>

Это решение XSLT 1.0 сделает это:

<xsl:template match="date">
  <xsl:copy>
    <xsl:value-of select="
      concat(
        substring(., 9, 2),
        '-',
        substring(., 6, 2),
        '-',
        substring(., 1, 4)
      )
    " />
  </xsl:copy>
</xsl:template>

Если ваша дата может быть

<xml>
  <date>2009-11-1</date>
</xml>

вам придется использовать чуть более сложный

<xsl:template match="date">
  <xsl:copy>
    <xsl:value-of select="
      concat(
        substring-after(substring-after(., '-'), '-'), 
        '-',
        substring-before(substring-after(., '-'), '-'), 
        '-',
        substring-before(., '-')
      )
    " />
  </xsl:copy>
</xsl:template>
1 голос
/ 18 ноября 2009

Вы также можете использовать шаблон.

   <?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
  <xsl:template match="/">

    <html>
      <body>
        <table class="bdr-bot" width="100%" border="0" cellspacing="0" cellpadding="0" style="clear:both">
          <tr>
            <th width="15%" class="bdr">Date</th>
            <th class="bdr">Title</th>
          </tr>
         <!-- <xsl:for-each select="hexML/body/press_releases/press_release">-->
            <xsl:if test="contains(published/@date, '2009')">
              <tr>
                <td valign="top">
                  <xsl:call-template name="FormatDate">
                    <xsl:with-param name="DateTime" select="published/@date"/>
                  </xsl:call-template>
                </td>
                  <td valign="top">
                  <a href="result-page.aspx?ResultPageURL={location/@href}">
                    <xsl:value-of select="headline"/>
                  </a>
                </td>
              </tr>
            </xsl:if>
          <!--</xsl:for-each>-->
        </table>
      </body>
    </html>
  </xsl:template>
  <xsl:template name="FormatDate">
    <xsl:param name="DateTime"/>
        <xsl:value-of select="substring($DateTime,9,2)"/>-<xsl:value-of select="substring($DateTime,6,2)"/>-<xsl:value-of select="substring($DateTime,1,4)"/><xsl:text> CET</xsl:text>
  </xsl:template>
</xsl:stylesheet>
0 голосов
/ 18 ноября 2009

Похоже, вам нужно использовать процессор с поддержкой схемы XSLT 2.0, чтобы получить встроенную поддержку того, что вы хотите делать с типом данных xs: dateTime и функцией format-date.

См. http://www.w3.org/TR/xmlschema-2/#dateTime, чтобы узнать, как XSLT 2.0 может анализировать вашу строку.

· лексическое пространство · dateTime состоит из последовательностей конечной длины символы вида: '-'? гггг '-' мм '-' дд 'т' чч ':' мм ':' сс ('.' s +)? (Zzzzzz)

См. http://www.dpawson.co.uk/xsl/rev2/dates.html#d16685e16 для получения вывода.

формат даты (xs: дата ( CONCAT ( подстрока ($ д, 1,4), '-', подстрока ($ д, 7,2), '-', подстрока ($ д, 5,2))), '[D01] [MNn] [Y0001]')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...