使用子字符串的 XSLT 日期格式

XSLT date format using substring

我的要求是进行一个传递日期的网络服务调用,以便我取回自该日期以来已更改的所有记录。我正在使用 Stylist Studio 2011 进行开发。我已经设法得到一个减去 2 天的日期,但它总是 returns 有一个时间:即 2015-06-20-05:00 但我只想要没有时间的日期。我尝试了以下示例中的子字符串和日期格式,但得到的结果是空的。

此代码returns 时间:

{<?xml version='1.0' ?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:v1="http://types.msfc.nasa.gov/personnel/messages/v1/" 
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:fn="http://www.w3.org/2005/xpath-functions">
    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
    <xsl:template match="/">
        <xsl:variable name="vToday" select="current-date()"/>

        <v1:lastChanged>
            <xsl:value-of select="$vToday -2*xs:dayTimeDuration('P1D')"/>
        </v1:lastChanged>
    </xsl:template>
</xsl:stylesheet>
}

结果是:

{
<v1:lastChanged xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="http://types.msfc.nasa.gov/personnel/messages/v1/">2015-06-20-05:00</v1:lastChanged>
}

这是我的子串尝试

{<?xml version='1.0' ?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:v1="http://types.msfc.nasa.gov/personnel/messages/v1/" 
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:fn="http://www.w3.org/2005/xpath-functions">
    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
    <xsl:template match="/">
        <xsl:variable name="vToday" select="current-date()"/>
        <xsl:variable name="vTodayTrim" select="$vToday -2*xs:dayTimeDuration('P1D')"/>
        <xsl:variable name="vTodayDate" fn:substring="(vTodayTrim,1 ,10)"/>
        <v1:lastChanged>
            <xsl:value-of select="vTodayDate"/>
        </v1:lastChanged>
    </xsl:template>
</xsl:stylesheet>
}

这是我的结果:

{`<v1:lastChanged xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="http://types.msfc.nasa.gov/personnel/messages/v1/"/>`
}

我已经尝试了所有这些的多种变体,我能说的最好的是我得到了一致的结果。我现在只是在追逐我的故事。

我自己解决了这个问题。这是现在有效的方法:

{
<?xml version='1.0' ?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:mro="http://www.ibm.com/maximo"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:v1="http://types.msfc.nasa.gov/personnel/messages/v1/" 
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:fn="http://www.w3.org/2005/xpath-functions">
    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
    <xsl:template match="/">
        <xsl:variable name="vToday" select="current-date()"/>
        <xsl:variable name="vTodayTrim" select="$vToday -2*xs:dayTimeDuration('P1D')"/>
        <v1:lastChanged>
            <xsl:value-of select="substring($vTodayTrim,1,10)"/>
        </v1:lastChanged>
    </xsl:template>
</xsl:stylesheet>
}

然后我回来

{
<v1:lastChanged xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:mro="http://www.ibm.com/maximo" xmlns:v1="http://types.msfc.nasa.gov/personnel/messages/v1/">2015-06-20</v1:lastChanged>
}

因此,由于我的应用程序不支持 2.0,我的新方法是在 xml 中设置值,然后将其通过 xslt,如下所示(xml 底部附近的 lastChanged 标记- 这是日志文件中的输出):

{
<InvokeNASAPERSON xmlns="http://www.ibm.com/maximo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" creationDateTime="2015-06-25T11:30:04-05:00" transLanguage="EN" baseLanguage="EN" messageID="1435249805139258092" maximoVersion="7 5 20130829-1209 V7510--1">
  <NASAPERSONSet>
    <PERSON>
      <DEPARTMENT />
      <DISPLAYNAME>MAXADMIN</DISPLAYNAME>
      <DROPPOINT />
      <FIRSTNAME />
      <LASTNAME />
      <LOCATION />
      <LOCATIONORG />
      <NASACENTER />
      <NASAFUNDINGORG />
      <NP_STATUSMEMO />
      <OWNERSYSID />
      <PERSONID>MAXADMIN</PERSONID>
      <PERSONUID>3</PERSONUID>
      <PRIMARYEMAIL>jreeve@cohesivesolutions.com</PRIMARYEMAIL>
      <PRIMARYPHONE>423 314 1312</PRIMARYPHONE>
      <SENDERSYSID>MX</SENDERSYSID>
      <SOURCESYSID />
      <STATUS maxvalue="ACTIVE">ACTIVE</STATUS>
      <STATUSDATE>2004-04-14T11:58:32-05:00</STATUSDATE>
      <STATUSIFACE>0</STATUSIFACE>
      <SUPERVISOR />
      <TITLE />
      <PHONE>
        <ISPRIMARY>1</ISPRIMARY>
        <PHONEID>82</PHONEID>
        <PHONENUM>423 314 1312</PHONENUM>
        <TYPE />
      </PHONE>
      <EMAIL>
        <EMAILADDRESS>jreeve@cohesivesolutions.com</EMAILADDRESS>
        <EMAILID>122</EMAILID>
      </EMAIL>
      <lastChanged>2015-06-23</lastChanged>
    </PERSON>
  </NASAPERSONSet>
</InvokeNASAPERSON>
}

我的 xslt 在 stylist studio 中测试时似乎可以正常工作。这是当前的 xslt

{
<?xml version='1.0' ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:mro="http://www.ibm.com/maximo" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="http://types.msfc.nasa.gov/personnel/messages/v1/" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
    <xsl:template match="/mro:InvokeNASAPERSON/mro:NASAPERSONSet/mro:PERSON">
        <v1:PersonQueryRequest>
            <v1:lastChanged>
                <xsl:value-of select="mro:lastChanged"/>
            </v1:lastChanged>
        </v1:PersonQueryRequest>
    </xsl:template>
</xsl:stylesheet>
}

和堆栈跟踪

{End of input XML
[6/25/15 11:30:06:075 CDT] 00000120 SystemOut     O 25 Jun 2015 11:30:06:075 [ERROR] [MXServer] [CID-CRON-265] com.ibm.xtq.xslt.jaxp.HandledRuntimeException: [ERR 0641] An error occurred while parsing document: 'Content is not allowed in prolog.'.
javax.xml.transform.TransformerConfigurationException: com.ibm.xtq.xslt.jaxp.HandledRuntimeException: [ERR 0641] An error occurred while parsing document: 'Content is not allowed in prolog.'.
    at com.ibm.xtq.xslt.jaxp.AbstractTransformerFactory.newTemplates(Unknown Source)
    at psdi.common.xsl.XSLTransformerCache.createTransformer(XSLTransformerCache.java:96)
    at psdi.common.xsl.XSLTransformerCache.getTransformer(XSLTransformerCache.java:67)
    at psdi.common.xsl.XSLTransformer.getTransformerFromPath(XSLTransformer.java:143)
    at psdi.common.xsl.XSLTransformer.transform(XSLTransformer.java:129)    at psdi.iface.migexits.ExitProcessor.mapData(ExitProcessor.java:607)
    at psdi.iface.migexits.ExitProcessor.executeOutExitLogic(ExitProcessor.java:458)
    at psdi.iface.migexits.ExitProcessor.processTheseExitsOut(ExitProcessor.java:342)
    at psdi.iface.migexits.ExitProcessor.processExitsOut(ExitProcessor.java:157)
    at psdi.iface.mic.InvokeChannel.processExitsOut(InvokeChannel.java:329)
    at psdi.iface.mic.InvokeChannel.invoke(InvokeChannel.java:102)
    at psdi.iface.action.InvokeCustomClass.applyCustomAction(InvokeCustomClass.java:109)
    at psdi.common.action.Action.executeCustomClass(Action.java:399)
    at psdi.common.action.Action.executeAction(Action.java:311)
    at psdi.common.action.Action.executeActionGroup(Action.java:365)
    at psdi.common.action.Action.executeAction(Action.java:331)
    at psdi.common.action.Action.executeAction(Action.java:344)
    at psdi.app.escalation.engine.EscalationTask.executeAction(EscalationTask.java:1454)
    at psdi.app.escalation.engine.EscalationTask.executeActions(EscalationTask.java:1372)
    at psdi.app.escalation.engine.EscalationTask.executeReferencePoint(EscalationTask.java:622)
    at psdi.app.escalation.engine.EscalationTask.processReferencePoint(EscalationTask.java:520)
    at psdi.app.escalation.engine.EscalationTask.performTask(EscalationTask.java:175)
    at psdi.app.escalation.engine.EscalationCronTask.cronAction(EscalationCronTask.java:46)
    at psdi.server.CronTaskManager.callCronMethod(CronTaskManager.java:1590)
    at psdi.server.CronTaskManager.access0(CronTaskManager.java:87)
    at psdi.server.CronTaskManager$CronThread.run(CronTaskManager.java:2156)
Caused by: com.ibm.xtq.xslt.jaxp.HandledRuntimeException: [ERR 0641] An error occurred while parsing document: 'Content is not allowed in prolog.'.
    at com.ibm.xtq.xslt.jaxp.ConfigurationErrorHandler.report(Unknown Source)
    at com.ibm.xtq.utils.Reporter.report(Unknown Source)
    at com.ibm.xtq.ast.parsers.xslt.XSLTParser.reportError(Unknown Source)
    at com.ibm.xtq.ast.parsers.xslt.XSLTParser.parse(Unknown Source)
    at com.ibm.xtq.ast.parsers.xslt.XSLTParser.parse(Unknown Source)
    at com.ibm.xtq.xslt.drivers.XSLTCompiler.makeAST(Unknown Source)
    at com.ibm.xtq.xslt.drivers.XSLTCompiler.buildAST(Unknown Source)
    at com.ibm.xtq.xslt.drivers.XSLTCompiler.compile(Unknown Source)
    at com.ibm.xtq.xslt.jaxp.compiler.TransformerFactoryImpl.createTemplates(Unknown Source)
    ... 26 more
[6/25/15 11:30:06:090 CDT] 00000120 SystemOut     O 25 Jun 2015 11:30:06:075 [ERROR] [MXServer] [CID-CRON-265] Failed to execute action  on escalation: {NASAPERSONWS} reference point: {155}  for object {PERSON} with id {3} 
psdi.util.MXSystemException: BMXAA4214E - An unknown error has occurred.
Please contact your system administrator for assistance. Gather the logs from the <HOME> directory and determine where and why the error is thrown.
    com.ibm.xtq.xslt.jaxp.HandledRuntimeException: [ERR 0641] An error occurred while parsing document: 'Content is not allowed in prolog.'.
    at psdi.iface.migexits.ExitProcessor.mapData(ExitProcessor.java:630)
    at psdi.iface.migexits.ExitProcessor.executeOutExitLogic(ExitProcessor.java:458)
    at psdi.iface.migexits.ExitProcessor.processTheseExitsOut(ExitProcessor.java:342)
    at psdi.iface.migexits.ExitProcessor.processExitsOut(ExitProcessor.java:157)
    at psdi.iface.mic.InvokeChannel.processExitsOut(InvokeChannel.java:329)
    at psdi.iface.mic.InvokeChannel.invoke(InvokeChannel.java:102)
    at psdi.iface.action.InvokeCustomClass.applyCustomAction(InvokeCustomClass.java:109)
    at psdi.common.action.Action.executeCustomClass(Action.java:399)
    at psdi.common.action.Action.executeAction(Action.java:311)
    at psdi.common.action.Action.executeActionGroup(Action.java:365)
    at psdi.common.action.Action.executeAction(Action.java:331)
    at psdi.common.action.Action.executeAction(Action.java:344)
    at psdi.app.escalation.engine.EscalationTask.executeAction(EscalationTask.java:1454)
    at psdi.app.escalation.engine.EscalationTask.executeActions(EscalationTask.java:1372)
    at psdi.app.escalation.engine.EscalationTask.executeReferencePoint(EscalationTask.java:622)
    at psdi.app.escalation.engine.EscalationTask.processReferencePoint(EscalationTask.java:520)
    at psdi.app.escalation.engine.EscalationTask.performTask(EscalationTask.java:175)
    at psdi.app.escalation.engine.EscalationCronTask.cronAction(EscalationCronTask.java:46)
    at psdi.server.CronTaskManager.callCronMethod(CronTaskManager.java:1590)
    at psdi.server.CronTaskManager.access0(CronTaskManager.java:87)
    at psdi.server.CronTaskManager$CronThread.run(CronTaskManager.java:2156)
Caused by: javax.xml.transform.TransformerConfigurationException: com.ibm.xtq.xslt.jaxp.HandledRuntimeException: [ERR 0641] An error occurred while parsing document: 'Content is not allowed in prolog.'.
    at com.ibm.xtq.xslt.jaxp.AbstractTransformerFactory.newTemplates(Unknown Source)
    at psdi.common.xsl.XSLTransformerCache.createTransformer(XSLTransformerCache.java:96)
    at psdi.common.xsl.XSLTransformerCache.getTransformer(XSLTransformerCache.java:67)
    at psdi.common.xsl.XSLTransformer.getTransformerFromPath(XSLTransformer.java:143)
    at psdi.common.xsl.XSLTransformer.transform(XSLTransformer.java:129)
    at psdi.iface.migexits.ExitProcessor.mapData(ExitProcessor.java:607)
    ... 20 more
Caused by: com.ibm.xtq.xslt.jaxp.HandledRuntimeException: [ERR 0641] An error occurred while parsing document: 'Content is not allowed in prolog.'.
    at com.ibm.xtq.xslt.jaxp.ConfigurationErrorHandler.report(Unknown Source)
    at com.ibm.xtq.utils.Reporter.report(Unknown Source)
    at com.ibm.xtq.ast.parsers.xslt.XSLTParser.reportError(Unknown Source)
    at com.ibm.xtq.ast.parsers.xslt.XSLTParser.parse(Unknown Source)
    at com.ibm.xtq.ast.parsers.xslt.XSLTParser.parse(Unknown Source)
    at com.ibm.xtq.xslt.drivers.XSLTCompiler.makeAST(Unknown Source)
    at com.ibm.xtq.xslt.drivers.XSLTCompiler.buildAST(Unknown Source)
    at com.ibm.xtq.xslt.drivers.XSLTCompiler.compile(Unknown Source)
    at com.ibm.xtq.xslt.jaxp.compiler.TransformerFactoryImpl.createTemplates(Unknown Source)
    ... 26 more

}

最后一种方法是正确的,我只是在引用 xsl 调用时被文件名弄糊涂了。此问题已解决。