2017-03-09 1 views
1

ich eine große XML-Datei und ich möchte angegebenen Elemente herauszufiltern basierend auf mehreren Bedingungen, insbesondere:XSLT auszufiltern Element mit mehreren Bedingungen

<title> contains 'K17' AND <category> contains 'APPLE' 

Also begann ich mit so etwas wie folgt aus:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:g="http://base.google.com/ns/1.0"> 
<xsl:output omit-xml-declaration="no" indent="yes" method="xml"/> 

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

<xsl:template match="item[not(title/contains(text(),'K17')) and not(category/contains(text(),'APPLE'))]" /> 

</xsl:stylesheet> 

Test-XML:

<channel> 
    <item> 
     <title>K170001 Test 1</title> 
     <category><![CDATA[APPLE &gt; MOBILE &gt; IPHONE]]></category> 
    </item> 
    <item> 
     <title>K170002 Test 2</title> 
     <category><![CDATA[APPLE &gt; MOBILE &gt; IPHONE]]></category> 
    </item> 
    <item> 
     <title>K1x70003 Test 3</title> 
     <category><![CDATA[APPLE &gt; MOBILE &gt; IPHONE]]></category> 
    </item> 
    <item> 
     <title>K170004 Test 4</title> 
     <category><![CDATA[APxPLE &gt; MOBILE &gt; IPHONE]]></category> 
    </item> 
</channel> 

die letzten beiden Elemente sollen nicht in dem endgültigen XML, beca sein verwende 'K1x70003' und 'APxPLE'.

Und das ist, wo meine XSLT fehlschlägt, sieht aus wie AND-Operator als OR-Operator funktioniert.

Antwort

2

Ihr aktueller Ausdruck hat die falsche Logik ... "nicht (X) und nicht (Y)" ist dasselbe wie "nicht (X oder Y)", wenn Sie "nicht (X und Y)" wollen das gleiche wie "nicht (X) oder nicht (Y)") ist

Versuchen Sie stattdessen (beachten Sie text() hier nicht wirklich notwendig ist)

<xsl:template match="item[not(contains(title,'K17') and contains(category,'APPLE'))]" /> 

oder gerade diese ....

<xsl:template match="item[not(contains(title,'K17')) or not(contains(category,'APPLE'))]" /> 

Beachten Sie, dass die Syntax title/contains(text(),'K17')) nur sollte in XSLT 2.0 gültig sein.