XSLT 1.0:根据与父元素属性匹配的元素的属性删除元素

时间:2017-02-01 12:06:51

标签: xml xslt xslt-1.0

我想在XML中保留元素,并在XSLT 1.0中基于与父属性匹配的属性值删除其他元素

我想只保留属性Journee与父属性Date匹配的DONNEES元素。它可以是任何我不能写的东西='2015-09-17T06:00:00'。

这是XML示例

<?xml version="1.0"?>
<Root>
    <JOURNEE Date="2015-09-17T06:00:00">
        <ID>
            <DONNEES Journee="2015-09-17T06:00:00"/>
            <DONNEES Journee="2015-09-18T06:00:00"/>
            <DONNEES Journee="2015-09-19T06:00:00"/>
        </ID>
    </JOURNEE>
    <JOURNEE Date="2015-09-18T06:00:00">
        <ID>
            <DONNEES Journee="2015-09-17T06:00:00"/>
            <DONNEES Journee="2015-09-18T06:00:00"/>
            <DONNEES Journee="2015-09-19T06:00:00"/>
        </ID>
    </JOURNEE>
    <JOURNEE Date="2015-09-19T06:00:00">
        <ID>
            <DONNEES Journee="2015-09-17T06:00:00"/>
            <DONNEES Journee="2015-09-18T06:00:00"/>
            <DONNEES Journee="2015-09-19T06:00:00"/>
        </ID>
    </JOURNEE>
</Root>

这是我想要的输出

<Root>
<JOURNEE Date="2015-09-17T06:00:00">
<ID>
<DONNEES Journee="2015-09-17T06:00:00"/>
</ID>
</JOURNEE>
<JOURNEE Date="2015-09-18T06:00:00">
<ID>
<DONNEES Journee="2015-09-18T06:00:00"/>
</ID>
</JOURNEE>
<JOURNEE Date="2015-09-19T06:00:00">
<ID>
<DONNEES Journee="2015-09-19T06:00:00"/>
</ID>
</JOURNEE>
</Root>

这是我现在使用的XSLT,它无法删除所有数据

<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>  
</xsl:template>

<xsl:template match="/*/*/*DONNEES[(@Journee != /*/JOURNEE/@Date)]" />

我尝试了这个并且它可以工作,但我不能拥有这样的数据

<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>  
</xsl:template>

<xsl:template match="/*/*/*DONNEES[(@Journee != '2015-09-17T06:00:00')]" />

谢谢:)

1 个答案:

答案 0 :(得分:1)

您应该在表达式中使用相对路径来获取祖先日期

试试这个XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes" />
    <xsl:strip-space elements="*" />

    <xsl:template match="DONNEES[@Journee != ../../@Date]" />

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>