Xml 使用xslt 1.0,我希望在<;日期>;小于当前日期。I';我使用java SimpleDataFormat进行比较
使用xslt的java语法是否有效?我没有支持java验证的xml转换工具,因此我不确定语法是否正确。如果没有,请告诉我是否有其他方法,我可以采取 因此,如果Xml 使用xslt 1.0,我希望在<;日期>;小于当前日期。I';我使用java SimpleDataFormat进行比较,xml,xslt,xslt-1.0,xalan,Xml,Xslt,Xslt 1.0,Xalan,使用xslt的java语法是否有效?我没有支持java验证的xml转换工具,因此我不确定语法是否正确。如果没有,请告诉我是否有其他方法,我可以采取 因此,如果RequestedDeliveryDate小于当前日期,则向当前日期添加5天,这将是新的RequestedDeliveryDate XSLT im使用: <?xml version="1.0" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/19
RequestedDeliveryDate
小于当前日期,则向当前日期添加5天,这将是新的RequestedDeliveryDate
XSLT im使用:
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:java="http://xml.apache.org/xslt/java" exclude-result-prefixes="java">
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="/tXML/Message/Order/OrderLines/OrderLine/ShippingInfo/RequestedDeliveryBy">
<xsl:choose>
<xsl:when test="(java:format(java:java.text.SimpleDateFormat.new('MM/dd/yyyy HH:mm'), java:java.util.Date.new()) >= '.')">
<RequestedDeliveryBy>
<xsl:value-of select="java:format(java:java.text.SimpleDateFormat.new('MM/dd/yyyy HH:mm'), java:java.util.Date.new(),5)" />
</RequestedDeliveryBy>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="." />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
测试xml:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<tXML>
<Message>
<Order>
<OrderLines>
<OrderLine>
<ShippingInfo>
<RequestedDeliveryBy>12/04/2015 23:59</RequestedDeliveryBy>
</ShippingInfo>
</OrderLine>
</OrderLines>
</Order>
</Message>
</tXML>
12/04/2015 23:59
您正在尝试将XSLT1.0与Java和Xalan结合使用。看到XSLT中的日期操作让我感到焦虑。日期处理并不是XSLT的强项。由于您已经习惯于使用Java方法,让我们让Java来完成这项艰巨的工作
我假设您以编程方式调用转换(例如,让Xalan可以访问XSLT引用的Java方法):
我们可以编写一个简单的类来处理您的RequestDeliveryByDate
我在这里使用它是因为它比Java早期版本捆绑的旧日期时间类更容易。如果您使用的是Java8或更高版本,则可以使用新的内置框架
package com.example;
import org.joda.time.LocalDateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
public class ProcessDate {
private static final String DATEPATTERN = "MM/dd/yyyy HH:mm";
private static final DateTimeFormatter FMT = DateTimeFormat.forPattern(DATEPATTERN);
public static String process(final String date) {
String result = date;
LocalDateTime now = new LocalDateTime();
LocalDateTime dt = LocalDateTime.parse(date, FMT);
if (now.isAfter(dt)) {
result = FMT.print(now.plusDays(5));
}
return result;
}
}
因此,通过Java完成所有繁重的工作,您的Transform.xsl变得非常简单:
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:java="http://xml.apache.org/xslt/java"
exclude-result-prefixes="java">
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="/tXML/Message/Order/OrderLines/OrderLine/ShippingInfo/RequestedDeliveryBy">
<RequestedDeliveryBy><xsl:value-of select="java:com.example.ProcessDate.process(string(.))"/></RequestedDeliveryBy>
</xsl:template>
</xsl:stylesheet>
ok在问题中添加了它。谢谢这个答案很好,只是它忽略了一个关键问题:时区。如果无法指定时区,则在解析该字符串时,将假定应用JVM的当前默认时区。如果您打算完全忽略时区(很少是一个好主意),那么使用。但我无权将其添加到java UTIL中。如果不添加类,是否可以执行此操作。我并不完全倾向于使用java。我肯定可以使用另一种没有java的方法。我敢说是可能的。很简单,可能不是。值得,陪审团出局了。Posside选项;1.将Xalan与嵌入式JavaScript结合使用-在JavaScript中,如果不使用库,日期处理可能会很棘手。2.使用支持EXSLT的“不稳定”日期函数的XSLT处理器(仍然是一个棘手的选项!)。3.不要使用XSLT,而是使用其他工具来处理XML,这些工具具有良好的XML和数据支持(例如Python、Ruby、Java、Perl、C#等)。在使用XSLT(管道!)转换XML之前,您还可以使用XSLT以外的东西对XML进行预处理。
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:java="http://xml.apache.org/xslt/java"
exclude-result-prefixes="java">
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="/tXML/Message/Order/OrderLines/OrderLine/ShippingInfo/RequestedDeliveryBy">
<RequestedDeliveryBy><xsl:value-of select="java:com.example.ProcessDate.process(string(.))"/></RequestedDeliveryBy>
</xsl:template>
</xsl:stylesheet>