XSLT过滤器比较同一子节点中的两个值
我需要使用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的值。
要删除Film
元素,其中FilmPostDate
和FilmActiveDate
实际上你可以窝在比赛的条件属性
<xsl:template
match="m:Film[m:FilmPostings/m:FilmPosting/m:FilmPostingDates[m:FilmPostDate = m:FilmActiveDate]]" />
这是假设只有一组的每Film
FilmPostDate
和FilmActiveDate
元素。如果存在多个集合,则可以尝试删除所有出现次数相同的元素(或者更确切地说,没有发生不同的事件)。
<xsl:template
match="m:Film[not(m:FilmPostings/m:FilmPosting/m:FilmPostingDates[m:FilmPostDate != m:FilmActiveDate])]" />
非常感谢。我想我没有足够解释这个精简数据模型的奇怪需求。我知道每个Film元素总是只有一个FilmPosting,我不在乎处理不同的情况。 –
我需要的实际模板是:
我现在面临着新的挑战 - 在第二个节点中,日期相差毫秒。我可以做一些解析从日期中删除这个组件吗? –
你能确认你的逻辑究竟是什么吗?您是否想要移除'FilmPostDate'和'FilmActiveDate'相等的'Film'元素?谢谢! –
是的,我。硬编码的例子做了一些不同的事情,但它向我确认这至少会排除A film节点。 –