1
我需要根據使用XSLT 1(和EXSLT)的日期比較將xml文檔轉換爲另一個xml文檔。模板匹配基於日期的XSLT1跳過子元素
以簡化形式的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 = < todaysdate < = D類似物(如2017年7月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']">
「*我怎麼能把日期標準放在模板匹配的範圍內*」你不能在匹配模式中引用一個變量,所以你可能不想這樣做。但是你可以通過將模板僅應用於那些通過測試的'B'來完成。 –