xml - 使用 xslt 1.0 当 <date> 小于当前日期时,我想将天数添加到当前日期。我使用 java SimpleDateFormat 进行比较

标签 xml xslt xslt-1.0 xalan

对于 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()) &gt;= '.')">
                <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")));

我们可以编写一个简单的类来处理您的 RequestDeliveryBy 日期。

我正在使用Joda-Time在这里,因为它比与早期版本的 Java 捆绑在一起的旧日期时间类更容易。如果您使用的是 Java 8 或更高版本,则可以使用新的内置 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>

关于xml - 使用 xslt 1.0 当 <date> 小于当前日期时,我想将天数添加到当前日期。我使用 java SimpleDateFormat 进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34164521/

相关文章:

python - 如何使用Python获取XML文件中child->child->child->child的内容

xml - 在条件下否定偏好吗?

xslt - XPath 有序优先属性搜索

xslt - 统一处理分组的兄弟元素

xml - 使用 XSLT 创建基于双重条件的元素

php - 使用 DOMDocument 创建复杂结构

c# - WPF 中的 XML 数据绑定(bind)

xml - 如何使用 xslt 向元素添加变量命名空间

XML 到 CSV 应用 XSLT(格式问题、逻辑错误)

java - 使用 groovy 脚本将 XML 中的值替换为 ParseText