模板匹配XSLT1根据日期跳过子元素

时间:2017-07-21 09:57:16

标签: xml xslt-1.0

我需要使用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 &gt; $today or $end &lt; $today">
        </xsl:if>
        <xsl:if
            test="($start &lt;= $today and not(D)) or ($start &lt;= $today and $end &gt;= $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 &gt; $today or $end &lt; $today">
        </xsl:if>
        <xsl:if
            test="($start &lt;= $today and not(D)) or ($start &lt;= $today and $end &gt;= $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']">

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 &gt; $today or $end &lt; $today">
        </xsl:if>
        <xsl:if
            test="($start &lt;= $today and not(E/D)) or ($start &lt;= $today and $end &gt;= $today)">
            <xsl:copy>
                <xsl:apply-templates select="node()|@*" />
            </xsl:copy>
        </xsl:if>
    </xsl:template>

然而,我仍然对如何将日期标准放在模板的匹配中感兴趣。