2017-01-09 77 views
0

我需要使用XSLT(版本1不幸)..我試圖通過比較子節點中的兩個屬性來過濾某些節點。XSLT過濾器比較同一子節點中的兩個值

這裏是XML:

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Header xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    </SOAP-ENV:Header> 
    <SOAP-ENV:Body xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <QueriesResponse xmlns="http://schemas.Movies.com/Movies"> 
     <Films xmlns="http://schemas.Movies.com/Movies"> 
     <Film> 
      <FilmPostings> 
      <FilmPosting> 
       <FilmPostingDates> 
       <FilmPostDate>2017-01-04T19:44:25.9530000-05:00</FilmPostDate> 
       <FilmActiveDate>2017-01-04T19:44:25.9530000-05:00</FilmActiveDate> 
       </FilmPostingDates> 
      </FilmPosting> 
      </FilmPostings> 
     </Film> 
     <Film> 
      <FilmPostings> 
      <FilmPosting> 
       <FilmPostingDates> 
       <FilmPostDate>2017-01-04T19:50:06.3830000-05:00</FilmPostDate> 
       <FilmActiveDate>2017-01-04T19:50:06.3100000-05:00</FilmActiveDate> 
       </FilmPostingDates> 
      </FilmPosting> 
      </FilmPostings> 
     </Film> 
     <Film> 
      <FilmPostings> 
      <FilmPosting> 
       <FilmPostingDates> 
       <FilmPostDate>2016-12-05T18:03:14.9830000-05:00</FilmPostDate> 
       <FilmActiveDate>2017-01-02T00:16:52.7570000-05:00</FilmActiveDate> 
       </FilmPostingDates> 
      </FilmPosting> 
      </FilmPostings> 
     </Film> 
     </Films> 
    </QueriesResponse> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

這裏是我的轉變:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns="http://schemas.Movies.com/Movies" 
       xmlns:m="http://schemas.Movies.com/Movies" 
       exclude-result-prefixes="m" 
       > 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" /> 

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

    <!-- This is mean to compare PostDate and ActiveDate, matching if different. It doesn't match any nodes in XML (but should match the final one). --> 
    <xsl:template match="m:Film[m:FilmPostings/m:FilmPosting/m:FilmPostingDates/m:FilmPostDate[1] [.!= m:FilmPostings/m:FilmPosting/m:FilmPostingDates/m:FilmActiveDate[1]]]"> 
    </xsl:template> 

    <!-- This code does match the hard coded value (the second node). --> 
    <!--<xsl:template match="m:Film[m:FilmPostings/m:FilmPosting/m:FilmPostingDates/m:FilmPostDate[1] [.!= '2017-01-04T19:50:06.3830000-05:00']]">  
    </xsl:template>--> 

</xsl:stylesheet> 

所以,你在註釋掉位看,我可以做一個匹配的硬編碼值,所以我顯然是在正確的區域 - 我知道如果代碼找到匹配,它將排除整個Film節點。但它比較了兩個不起作用的節點值。

我在比較的右側嘗試了各種變體,但它似乎無法獲取ActiveDate的值。

+0

你能確認你的邏輯究竟是什麼嗎?您是否想要移除'FilmPostDate'和'FilmActiveDate'相等的'Film'元素?謝謝! –

+0

是的,我。硬編碼的例子做了一些不同的事情,但它向我確認這至少會排除A film節點。 –

回答

1

要刪除Film元素,其中FilmPostDateFilmActiveDate實際上你可以窩在比賽的條件屬性

<xsl:template 
    match="m:Film[m:FilmPostings/m:FilmPosting/m:FilmPostingDates[m:FilmPostDate = m:FilmActiveDate]]" /> 

這是假設只有一組的每FilmFilmPostDateFilmActiveDate元素。如果存在多個集合,則可以嘗試刪除所有出現次數相同的元素(或者更確切地說,沒有發生不同的事件)。

<xsl:template 
    match="m:Film[not(m:FilmPostings/m:FilmPosting/m:FilmPostingDates[m:FilmPostDate != m:FilmActiveDate])]" /> 
+0

非常感謝。我想我沒有足夠解釋這個精簡數據模型的奇怪需求。我知道每個Film元素總是隻有一個FilmPosting,我不在乎處理不同的情況。 –

+0

我需要的實際模板是: 即值在哪裏不同。 –

+0

我現在面臨着新的挑戰 - 在第二個節點中,日期相差毫秒。我可以做一些解析從日期中刪除這個組件嗎? –

相關問題