XSLT только пропускает повторяющиеся записи - PullRequest
0 голосов
/ 09 марта 2012

Можно ли выполнить фильтрацию по указанному полю, а затем, когда два поля одинаковы, пропустить только эти две иерархии.Под этим я подразумеваю:

Входные данные:

<?xml version="1.0" encoding="UTF-8"?>
<payload>
    <set>
        <field1>compare</field1>
        <field2>info</field2>
        <field3>more infor</field3>
    </set>
    <set>
        <field4>compare</field4>
        <field5>put through</field5>
        <field6>this too</field6>
    </set>
    <set>
        <field1>compare1</field1>
        <field2>info</field2>
        <field3>more infor</field3>
    </set>
    <set>
        <field4>compare2</field4>
        <field5>put through</field5>
        <field6>this too</field6>
    </set>
    <set>
        <field1>compare2</field1>
        <field2>info</field2>
        <field3>more infor</field3>
    </set>
</payload>

Затем сравните поле field1 с идентичным содержимым, так что «сравнивайте» и «сравнивайте2» и пропустите только эти четыре,вывод выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<payload>
    <set>
        <field1>compare</field1>
        <field2>info</field2>
        <field3>more infor</field3>
    </set>
    <set>
        <field4>compare</field4>
        <field5>put through</field5>
        <field6>this too</field6>
    </set>
    <set>
        <field4>compare2</field4>
        <field5>put through</field5>
        <field6>this too</field6>
    </set>
    <set>
        <field1>compare2</field1>
        <field2>info</field2>
        <field3>more infor</field3>
    </set>
</payload>

Как бы вы написали XSLT для сравнения и пропускали только совпадения?

1 Ответ

2 голосов
/ 09 марта 2012

Хотите сравнить первый дочерний элемент каждого элемента set с первым дочерним элементом других элементов set? Если я правильно понимаю, тогда с XSLT 1.0 вы можете использовать ключ как в

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:key name="k1" match="set" use="*[1]"/>

<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>

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

<xsl:template match="payload">
  <xsl:copy>
    <xsl:apply-templates select="set[key('k1', *[1])[2]]"/>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

С XSLT 2.0 вы можете сделать это еще короче:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:key name="k1" match="set" use="*[1]"/>

<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>

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

<xsl:template match="set[not(key('k1', *[1])[2])]"/>

</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...