使用 xslt 1.0 我想在 <date> 小于当前日期时将天数添加到当前日期。我正在使用 java SimpleDateFormat 进行比较
Using xslt 1.0 I want to add days to current date when <date> is less than current date. I'm using java SimpleDateFormat for comparison
对 xslt 使用 java 语法是否有效?我没有支持 java 的 xml 转换工具进行验证,所以我不确定语法是否正确。如果没有任何人可以让我知道我是否可以采取任何其他方法?
因此,如果 RequestedDeliveryDate
小于当前日期,则将当前日期加上 5 天,这将是新的 RequestedDeliveryDate
。
我正在使用 XSLT:
<?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>
您正在尝试将 XSLT 1.0 与 Java 和 Xalan 一起使用。看到 XSLT 中的日期操作让我感到焦虑。日期处理并不是 XSLT 的强项。由于您已经听天由命地使用 Java 方法,让我们让 Java 完成艰苦的工作。
我假设您正在以编程方式调用您的转换(例如,这样 Xalan 就可以访问 XSLT 引用的 Java 方法):
TransformerFactory tFactory
= TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer(new StreamSource("Transform.xsl"));
transformer.transform(new StreamSource("Test.xml"),
new StreamResult(new FileOutputStream("Out.xml")));
我们可以编写一个非常简单的 class 来处理您的 RequestDeliveryBy 日期。
我正在使用 Joda-Time here because it is easier than the old date-time classes bundled with early versions of Java. If you are using Java 8 or later you can instead use the new built-in java.time 框架。
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>
对 xslt 使用 java 语法是否有效?我没有支持 java 的 xml 转换工具进行验证,所以我不确定语法是否正确。如果没有任何人可以让我知道我是否可以采取任何其他方法?
因此,如果 RequestedDeliveryDate
小于当前日期,则将当前日期加上 5 天,这将是新的 RequestedDeliveryDate
。
我正在使用 XSLT:
<?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>
您正在尝试将 XSLT 1.0 与 Java 和 Xalan 一起使用。看到 XSLT 中的日期操作让我感到焦虑。日期处理并不是 XSLT 的强项。由于您已经听天由命地使用 Java 方法,让我们让 Java 完成艰苦的工作。
我假设您正在以编程方式调用您的转换(例如,这样 Xalan 就可以访问 XSLT 引用的 Java 方法):
TransformerFactory tFactory
= TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer(new StreamSource("Transform.xsl"));
transformer.transform(new StreamSource("Test.xml"),
new StreamResult(new FileOutputStream("Out.xml")));
我们可以编写一个非常简单的 class 来处理您的 RequestDeliveryBy 日期。
我正在使用 Joda-Time here because it is easier than the old date-time classes bundled with early versions of Java. If you are using Java 8 or later you can instead use the new built-in java.time 框架。
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>