2015-06-22 2 views
0

Мое требование состоит в том, чтобы сделать вызов webservice, передающий дату, чтобы получить все записи назад, которые были изменены с этой даты. Я использую Stylist Studio 2011 для своего развития. Мне удалось получить дату минус 2 дня, но она всегда возвращается со временем: i. 2015-06-20-05: 00, но я хочу только дату без времени. Я пробовал подстроку, как в следующем примере и формате даты, но я получаю пустой результат.Формат даты XSLT с использованием подстроки

Этот код возвращается со временем:

{<?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 - это вывод в лог-файл):

{ 
<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>[email protected]</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>[email protected]</EMAILADDRESS> 
     <EMAILID>122</EMAILID> 
     </EMAIL> 
     <lastChanged>2015-06-23</lastChanged> 
    </PERSON> 
    </NASAPERSONSet> 
</InvokeNASAPERSON> 
} 

Мой XSLT, кажется, работает, когда я проверить его в стилиста студии. Вот текущий 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> 
} 

и StackTrace

{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.access$400(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.access$400(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 

}

+0

Вы отметили это как 'xslt-1.0', и ваша таблица стилей объявляет' version = "1.0" ', но то, что вы показываете нам, будет работать только в XSLT 2.0. –

+0

Отмечено. Я сделал другой подход. Приложение, в котором я работаю, не поддерживает 2.0, поэтому мне пришлось принять другой подход. Теперь я устанавливаю значение даты, которое мне нужно, используя код java во входящем XML. Я изменил xslt как из этого xml, мне нужно только одно значение (для веб-службы запроса), которое является значением даты, и, конечно, изменить теги на то, что понимает веб-службы. У меня есть обработчик, который создает мыльный конверт вокруг xml, но xslt не работает с «Контентом, который не разрешен в прологе. – TOMB523

ответ

0

Этот последний подход был правильным, я просто жир перебирал по имени файла при ссылке на вызов XSL. Эти проблемы решены.

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