我需要使用XSLT 1(和EXSLT)基于日期比较将xml文档转换为另一个xml文档。
简化形式的XML
<TAG>
<A>
<id>1234</id>
<B>
<id2>1</id2>
<E>
<C>2017-07-01</C>
<D>2017-07-05</D>
</E>
</B>
<B>
<id2>2</id2>
<E>
<C>2017-07-21</C>
<D>2017-07-28</D>
</E>
</B>
</A>
</TAG>
我只想要B&E元素,其中C&lt; = todaysdate&lt; = D like(截至2017-07-21)
<TAG>
<A>
<id>1234</id>
<B>
<id2>2</id2>
<E>
<C>2017-07-21</C>
<D>2017-07-28</D>
</E>
</B>
</A>
</TAG>
我到目前为止的xsl是
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:date="http://exslt.org/dates-and-times">
<xsl:output method="xml" indent="yes" />
<xsl:variable name="today"
select="translate(substring-before(date:date-time(), 'T'), '-', '')" />
<xsl:template match="TAG/A">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="B/E">
<xsl:variable name="start" select="translate(C, '-', '')" />
<xsl:variable name="end" select="translate(D, '-', '')" />
<xsl:if test="$start > $today or $end < $today">
</xsl:if>
<xsl:if
test="($start <= $today and not(D)) or ($start <= $today and $end >= $today)">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:if>
</xsl:template>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
给了我
<?xml version="1.0"?>
<TAG>
<A>
<id>1234</id>
<B>
<id2>1</id2>
</B>
<B>
<id2>2</id2>
<E>
<C>2017-07-21</C>
<D>2017-07-28</D>
</E>
</B>
</A>
</TAG>
我需要摆脱B标签 - 但无法弄清楚如何做到这一点。我试过用
<xsl:template match="B">
<xsl:variable name="start" select="translate(E/C, '-', '')" />
<xsl:variable name="end" select="translate(E/D, '-', '')" />
<xsl:if test="$start > $today or $end < $today">
</xsl:if>
<xsl:if
test="($start <= $today and not(D)) or ($start <= $today and $end >= $today)">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:if>
</xsl:template>
然后我获得了完整的XML。当在C和D中使用整数值时,我知道如何将条件置于匹配中(以选择C = 1的那些,如下所示),但无法确定日期比较。任何帮助表示赞赏。对不起,如果这是一个蹩脚的问题 - 我是XSLT新手:)
<xsl:template match="A[B/E/C='1']">
答案 0 :(得分:0)
糟糕。不(D)替换为不(E / D)并立即工作
<xsl:template match="B">
<xsl:variable name="start" select="translate(E/C, '-', '')" />
<xsl:variable name="end" select="translate(E/D, '-', '')" />
<xsl:if test="$start > $today or $end < $today">
</xsl:if>
<xsl:if
test="($start <= $today and not(E/D)) or ($start <= $today and $end >= $today)">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:if>
</xsl:template>
然而,我仍然对如何将日期标准放在模板的匹配中感兴趣。