过滤键无响应

时间:2015-10-01 12:26:22

标签: xslt-1.0

我有一张xslt表,其中有2个响应对象。 $ response1包含一个id列表:

<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与响应1中包含的内容匹配的任何对象

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

任何想法都非常感激 ç

1 个答案:

答案 0 :(得分: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>