2015-01-16 1 views
2

Публикация в первый раз и очень новая работа с XML и XSL.Преобразование эпохи в Date через XSL из атрибута XML и отображение в HTML

Я провел два дня на этой доске, а другие искали мой ответ. Я вижу сообщения, похожие на мои, но не точные. Приносим извинения, если это избыточно.

У меня есть документ XML, который выводится мне из стороннего приложения на ежедневной основе. Мне нужно отобразить на веб-странице две части информации: LoginName и LastBackupDate.

Я могу сделать это с помощью XSL, который я написал. Однако LastBackupDate находится в формате epoch. Мне нужно преобразовать его в читаемую человеком дату/время (mm-dd-yyyy hh: mm: ss).

Можно ли преобразовать это «на лету» через таблицу стилей XSL?

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

Что определенно усложняет для меня формат XML-файла - это в основном атрибуты. В большинстве случаев, которые я нахожу, используются элементы.

Вот мой XML (company1.xml):

<?xml version="1.0" encoding="UTF-8" ?> 
<?xml-stylesheet type="text/xsl" href="company1.xsl" ?> 

    <Users> 
    <User LoginName="server1" Owner="company1" UserId="server1#24545" Alias="server1" UserType="PAID" ClientType="ERM" Quota="536870912000" Timezone="GMT+01:00 (CEST)" Language="en" DataFile="191277" DataSize="120105299488" RetainFile="1195" RetainSize="49220308" EnableMSSQL="Y" EnableMSExchange="N" MsExchangeQuota="0" EnableOracle="N" EnableLotusNotes="N" EnableLotusDomino="N" EnableMySQL="N" EnableInFileDelta="Y" EnableShadowCopy="Y" EnableExchangeMailbox="N" ExchangeMailboxQuota="0" EnableNASClient="N" EnableDeltaMerge="N" EnableMsVm="N" MsVmQuota="0" EnableVMware="N" VMwareQuota="0" Bandwidth="0" Notes="" Status="ENABLE" RegistrationDate="1222175386552" SuspendPaidUser="N" SuspendPaidUserDate="20110221" LastBackupDate="1421247632689" EnableCDP="Y" EnableShadowProtectBareMetal="Y" EnableWinServer2008BareMetal="Y" Hostname="backup.company1.com"> 
     <Contact Name="Spain Reception" Email="[email protected]" /> 
    </User> 
    <User LoginName="server2" Owner="company1" UserId="server2#24545" Alias="server2" UserType="PAID" ClientType="ERM" Quota="536870912000" Timezone="GMT-06:00 (CDT)" Language="en" DataFile="123920" DataSize="69665584875" RetainFile="0" RetainSize="0" EnableMSSQL="Y" EnableMSExchange="N" MsExchangeQuota="0" EnableOracle="N" EnableLotusNotes="N" EnableLotusDomino="N" EnableMySQL="N" EnableInFileDelta="Y" EnableShadowCopy="Y" EnableExchangeMailbox="N" ExchangeMailboxQuota="0" EnableNASClient="N" EnableDeltaMerge="N" EnableMsVm="N" MsVmQuota="0" EnableVMware="N" VMwareQuota="0" Bandwidth="0" Notes="" Status="ENABLE" RegistrationDate="1212767489088" SuspendPaidUser="N" SuspendPaidUserDate="20141223" LastBackupDate="1361926839272" EnableCDP="Y" EnableShadowProtectBareMetal="Y" EnableWinServer2008BareMetal="Y" Hostname="backup.company1.com"> 
     <Contact Name="server2" Email="[email protected]" /> 
    </User> 
    </Users> 

Вот мой XSL (company1.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> 
     <h3>COMPANY1 Last Backup Date</h3> 
     <table border="1"> 
     <tr bgcolor="#9acd32"> 
      <th>LoginName</th> 
      <th>Epoch LastBackupDate</th> 
      <th>Human dateTime</th> 
     </tr> 

     <xsl:for-each select="//User"> 
      <tr> 
      <td> 
       <xsl:value-of select="@LoginName" /> 
      </td> 
      <td> 
       <xsl:value-of select="@LastBackupDate" /> 
      </td> 
      <td> 
       <xsl:value-of select='xs:dateTime("1970-01-01T00:00:00") @LastBackupDate * xs:dayTimeDuration("PT0.001S")'/> 
      </td> 
      </tr> 
     </xsl:for-each> 

     </table> 
    </body> 

    </html> 
    </xsl:template> 

</xsl:stylesheet> 

ответ

4

Там нет такого понятия, как "формат эпохи". AFAICT, ваш LastBackupDate на самом деле является числом миллисекунд, прошедшим с 1970-01-01T00: 00: 00. В XSLT 1.0, вы можете использовать следующий шаблон для преобразования его даты и времени представления ISO:

<xsl:template name="millisecs-to-ISO"> 
    <xsl:param name="millisecs"/> 

    <xsl:param name="JDN" select="floor($millisecs div 86400000) + 2440588"/> 
    <xsl:param name="mSec" select="$millisecs mod 86400000"/> 

    <xsl:param name="f" select="$JDN + 1401 + floor((floor((4 * $JDN + 274277) div 146097) * 3) div 4) - 38"/> 
    <xsl:param name="e" select="4*$f + 3"/> 
    <xsl:param name="g" select="floor(($e mod 1461) div 4)"/> 
    <xsl:param name="h" select="5*$g + 2"/> 

    <xsl:param name="d" select="floor(($h mod 153) div 5) + 1"/> 
    <xsl:param name="m" select="(floor($h div 153) + 2) mod 12 + 1"/> 
    <xsl:param name="y" select="floor($e div 1461) - 4716 + floor((14 - $m) div 12)"/> 

    <xsl:param name="H" select="floor($mSec div 3600000)"/> 
    <xsl:param name="M" select="floor($mSec mod 3600000 div 60000)"/> 
    <xsl:param name="S" select="$mSec mod 60000 div 1000"/> 

    <xsl:value-of select="concat($y, format-number($m, '-00'), format-number($d, '-00'))" /> 
    <xsl:value-of select="concat(format-number($H, 'T00'), format-number($M, ':00'), format-number($S, ':00'))" /> 
</xsl:template> 

Пример вызова:

<xsl:call-template name="millisecs-to-ISO"> 
    <xsl:with-param name="millisecs" select="1421247632689" /> 
</xsl:call-template> 

Результат:

2015-01-14T15:00:33 
+0

Это был он! Спасибо! Чтобы завершить код, следующий за тем, что я установил выше, в вызове ваш оператор select будет читать: выберите «@LastBackupDate». Работал мгновенно! Еще раз спасибо! –

Смежные вопросы