2015-10-01 2 views
0

У меня есть лист xslt, в котором у меня есть 2 объекта ответа. $ Response1 содержит список идентификаторов что-то вроде:Ключи фильтра из ответа

<response> 
    <idlist> 
    <id>1</id> 
    <id>2</id> 
    </idlist> 
</response> 

И $ response2 содержит ряд объектов:

<response2> 
    <obj id="1" name="obj1"/> 
    <obj id="2" name="obj2"/> 
    <obj id="3" name="obj3"/> 
    <obj id="4" name="obj4"/> 
</response2> 

Я хочу, чтобы сделать копию response2 но отфильтровывать любые объекты, где ID матчи Thos содержится в ответе 1

<xsl:variable name="copy"> 
    <xsl:copy-of select="$response2/*[not contains($response1, id)]"/> 
</xsl:variable> 

любые идеи высоко оценили с

+0

http://stackoverflow.com/help/someone-answers –

ответ

0

Учитывая хорошо сформированные ввода, такое как:

<root> 
    <response> 
    <idlist> 
     <id>1</id> 
     <id>2</id> 
    </idlist> 
    </response> 
    <response2> 
    <obj id="1" name="obj1"/> 
    <obj id="2" name="obj2"/> 
    <obj id="3" name="obj3"/> 
    <obj id="4" name="obj4"/> 
    </response2> 
</root> 

следующая таблица стилей:

XSLT-1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:template match="/root"> 
    <xsl:variable name="ids" select="response/idlist/id" /> 
    <output> 
     <xsl:copy-of select="response2/obj[not(@id=$ids)]"/> 
    </output> 
</xsl:template> 

</xsl:stylesheet> 

вернется:

<?xml version="1.0" encoding="UTF-8"?> 
<output> 
    <obj id="3" name="obj3"/> 
    <obj id="4" name="obj4"/> 
</output> 

Лучшее решение заключается в использовании key, чтобы связать узлы путем сопоставления id:

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:key name="id" match="id" use="." /> 

<xsl:template match="/root"> 
    <output> 
     <xsl:copy-of select="response2/obj[not(key('id', @id))]"/> 
    </output> 
</xsl:template> 

</xsl:stylesheet>