Дата и время преобразования XSLT к формату даты

Нашел ответ на мой вопрос:

function funct($xls){
    include_once '../system/PHPExcel/Classes/PHPExcel/IOFactory.php';
    $objPHPExcel = PHPExcel_IOFactory::load($xls);
    $objPHPExcel->setActiveSheetIndex(9);

    $aSheet = $objPHPExcel->getActiveSheet();
     $array = array();

    foreach($aSheet->getRowIterator() as $row){

      $cellIterator = $row->getCellIterator();
    //this array will contain arrays with cells values
      $item = array();
       foreach($cellIterator as $key => $cell){
//merged cells echo start
     foreach ($aSheet->getMergeCells() as $cells) {
if ($cell->isInRange($cells)) {
$currMergedCellsArray = PHPExcel_Cell::splitRange($cells);
$cell = $aSheet->getCell($currMergedCellsArray[0][0]);
echo $cells,'\n';
    echo '';
    break;
}
}
//merged cells echo end
//skip adding tables which we don't need
if($key == "A" || $key == "E" || $key == "F" || $key == "G" || $key == 'H') continue;

        array_push($item, $cell->getCalculatedValue());
      }
      array_push($array, $item);
    }
    return $array;
  }
5
задан freggel 29 January 2009 в 07:37
поделиться

3 ответа

Благодаря 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>     

1
ответ дан 18 December 2019 в 12:02
поделиться

Откровенно говоря, это озирается вокруг права мне - иногда, простая подстрока достаточно хороша.

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


править: ОИК, у Вас есть основные применять-шаблоны концептуальная проблема. Попробуйте это (отметьте копию и корневое шаблонное соответствие):

<?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.

7
ответ дан 18 December 2019 в 12:02
поделиться

Форматирование станет намного проще в 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: script.

XslCompiledTransform.Load(reader, XsltSettings.TrustedXslt, null);
7
ответ дан 18 December 2019 в 12:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: