2017-01-09 14 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

Можете ли вы подтвердить свою логику? Вы пытаетесь удалить элементы 'Film', где« FilmPostDate »и« FilmActiveDate »равны? Благодаря! –

+0

Да, я. Жестко закодированный пример делает что-то другое, но он просто подтвердил мне, что это, по крайней мере, исключит узел фильма. –

ответ

1

Чтобы удалить Film элементы, где FilmPostDate и FilmActiveDate вы можете гнездовые условия в матче приписывать

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

Это предполагает только один набор FilmPostDate и FilmActiveDate элементов на Film. Если было несколько наборов, вы можете попробовать удалить Film элементов, где все вхождения одинаковы (или, скорее, не являются вхождениями, которые были разными).

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

Большое вам спасибо. Наверное, я не объяснил достаточно странных требований вокруг этой урезанной модели данных. Я знаю, что всегда будет ровно один элемент FilmPosting per Film, и я не забочусь об обработке разных ситуаций. –

+0

Фактический шаблон, который делает то, что мне нужно, это: ie, где значения разные. –

+0

Теперь я сталкиваюсь с новой задачей, когда во втором узле даты отличаются на миллисекунды. Можно ли выполнить какой-либо разбор, чтобы удалить этот компонент с даты? –