XSLT преобразование даты и времени в формат даты - PullRequest
5 голосов
/ 28 января 2009

Я пытаюсь преобразовать дату и время в формат даты yyyy-MM-dd, потому что я использую инструмент xsd.exe, типы данных xs: date автоматически изменяются на тип данных datetime, потому что в .NET Framework, полностью соответствующий типу xs: date.

Но я не могу заставить его работать

<articles>
        <article>
          <articleid>48992</articleid>
          <deliverydateasked>2009-01-29T00:00:00+01:00</deliverydateasked>
        </article>
        <article>
          <articleid>48993</articleid>
          <deliverydateasked>2009-01-30T00:00:00+01:00</deliverydateasked>
        </article>
</articles>

пытается преобразовать xml в

<articles>
        <article>
          <articleid>48992</articleid>
          <deliverydateasked>2009-01-29</deliverydateasked>
        </article>
        <article>
          <articleid>48993</articleid>
          <deliverydateasked>2009-01-30</deliverydateasked>
        </article>
</articles>

В настоящее время я использую этот XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
    <articles>
        <xsl:apply-templates select="article">
        </xsl:apply-templates>
            </articles>
</xsl:template>

<xsl:template name="FormatDate">

    <xsl:param name="DateTime" />
    <xsl:variable name="date">
        <xsl:value-of select="substring-before($DateTime,'T')" />
    </xsl:variable>

    <xsl:if test="string-length($date) != 10">
        <xsl:value-of select="$DateTime"/>
    </xsl:if>
    <xsl:if test="string-length($date) = 10">
        <xsl:value-of select="$date"/>
    </xsl:if>
</xsl:template>

<xsl:template match="article">
        <xsl:call-template name="FormatDate">
            <xsl:with-param name="DateTime" select="deliverydateasked"/>
        </xsl:call-template>    
</xsl:template>     

Кто-нибудь знает хорошее преобразование xslt.

Заранее спасибо

Результат вывода моего кода

<articles /> 

Ответы [ 3 ]

7 голосов
/ 28 января 2009

Честно говоря, мне это кажется правильным - иногда достаточно простой подстроки.

Тем не менее, если вы находитесь на земле .NET и вам действительно нужны дополнительные функции, в .NET есть объекты расширения XSLT


edit: oic, у вас есть базовая концептуальная проблема применения шаблонов. Попробуйте это (обратите внимание, копия и соответствие корневого шаблона):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template match="*">
    <xsl:copy><xsl:apply-templates /></xsl:copy>
</xsl:template>

<xsl:template match="deliverydateasked">
    <xsl:copy>
        <xsl:call-template name="FormatDate">
            <xsl:with-param name="DateTime" select="."/>
        </xsl:call-template>    
    </xsl:copy>
</xsl:template>

<xsl:template name="FormatDate">

        <xsl:param name="DateTime" />
        <xsl:variable name="date">
                <xsl:value-of select="substring-before($DateTime,'T')" />
        </xsl:variable>

        <xsl:if test="string-length($date) != 10">
                <xsl:value-of select="$DateTime"/>
        </xsl:if>
        <xsl:if test="string-length($date) = 10">
                <xsl:value-of select="$date"/>
        </xsl:if>
</xsl:template>

</xsl:stylesheet>

Шаблоны - это сложная концепция для изучения, лучше начать с более простого for-each и / или, кажется, вы могли бы использовать некоторые учебники / книги по XSLT.

6 голосов
/ 23 марта 2010

Форматирование станет намного проще в XPath 2.0, который Microsoft в настоящее время отказывается поддерживать в течение последних 8 лет. Поскольку проблема форматирования действительно актуальна только для XSLT в .Net, мне нравится использовать пользовательские функции, которые чище и проще:

XSLT с функцией форматирования:

    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    xmlns:user="http://www.tempuri.org/User">

  <msxsl:script implements-prefix="user" language="C#">
        <![CDATA[
          public string FormatCurrency(string amount)
          {
            return decimal.Parse(amount).ToString("C0");
          }

          public string FormatDate(string dateValue)
          {
            return DateTime.Parse(dateValue).ToString("MM/dd/yyyy hh:mm");
          }
          ]]>
      </msxsl:script>

Использование:

<xsl:value-of select="user:FormatDate(@transactionDate)"/>
<xsl:value-of select="user:FormatCurrency(@amount)"/>

Когда вы запускаете XSLT в .Net, обязательно сообщите ему, что он является доверенным (чтобы выполнялся блок сценария msxsl: *.

XslCompiledTransform.Load(reader, XsltSettings.TrustedXslt, null);
1 голос
/ 29 января 2009

Благодаря Stesoc и annakata я понял это Это код, который я сейчас использую, и он отлично работает

<xsl:template match="*">
    <xsl:param name="parentElm">
        <xsl:value-of select="name(..)" />
    </xsl:param>
    <xsl:choose>
        <xsl:when test="local-name() = 'deliverydateasked'">
            <xsl:element name="deliverydateasked">
                <xsl:call-template name="FormatDate">
                    <xsl:with-param name="DateTime" select="."/>
                </xsl:call-template>
            </xsl:element>
        </xsl:when>
        <xsl:otherwise>
            <xsl:element name="{local-name()}">
                <xsl:copy-of select="@*" />
                <xsl:apply-templates select="@* | node()" />
            </xsl:element>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

<xsl:template name="FormatDate">
    <xsl:param name="DateTime" />
    <xsl:variable name="date">
        <xsl:value-of select="substring-before($DateTime,'T')" />
    </xsl:variable>

    <xsl:if test="string-length($date) != 10">
        <xsl:value-of select="$DateTime"/>
    </xsl:if>
    <xsl:if test="string-length($date) = 10">
        <xsl:value-of select="$date"/>
    </xsl:if>
</xsl:template>     

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