Можно ли отфильтровать дубликаты записей с помощью таблицы стилей XSLT? - PullRequest
0 голосов
/ 06 марта 2012

Возможно ли отфильтровать дубликаты записей с помощью таблицы стилей XSLT.Под этим я подразумеваю, если вы получите следующий код в качестве входных данных:

<payload>
    <name>1</name>
    <date>2</date>
</payload>
<payload>
    <name>1</name>
    <date>2</date>
</payload>
<payload>
    <name>10</name>
    <date>20</date>
</payload>
<payload>
    <name>1</name>
    <date>2</date>
</payload>

сможет ли он отфильтровать входные данные для получения этого вывода:

<payload>
    <name>1</name>
    <date>2</date>
</payload>
<payload>
    <name>10</name>
    <date>20</date>
</payload>

Ответы [ 2 ]

1 голос
/ 06 марта 2012

Вот опция XSLT 1.0 ...

Таблица стилей XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:key name="kPayloads" match="payload" use="concat('N',name,'D',date)"/>

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

  <xsl:template match="payloads">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:apply-templates select="payload[generate-id() = generate-id(key('kPayloads', concat('N',name,'D',date)))]"/>
    </xsl:copy>
  </xsl:template>    

</xsl:stylesheet>

Ввод XML (правильно сформированный)

<payloads>
  <payload>
    <name>1</name>
    <date>2</date>
  </payload>
  <payload>
    <name>1</name>
    <date>2</date>
  </payload>
  <payload>
    <name>10</name>
    <date>20</date>
  </payload>
  <payload>
    <name>1</name>
    <date>2</date>
  </payload>  
</payloads>

Вывод XML

<payloads>
   <payload>
      <name>1</name>
      <date>2</date>
   </payload>
   <payload>
      <name>10</name>
      <date>20</date>
   </payload>
</payloads>

Редактировать

Эта таблица стилей XSLT 2.0 также выдаст тот же результат ...

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

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

  <xsl:template match="payloads">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:for-each-group select="payload" group-by="concat('N',name,'D',date)">
        <xsl:copy>
          <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>        
      </xsl:for-each-group>
    </xsl:copy>
  </xsl:template>    

</xsl:stylesheet>
1 голос
/ 06 марта 2012

Делает ли это то, что вы хотите?

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:cds="cds_dt" exclude-result-prefixes="cds">

    <xsl:template match="/">
        <root>
        <xsl:apply-templates select="/root/payload"/>
        </root>
    </xsl:template>

    <xsl:template match="/root/payload">
        <xsl:if test="not(preceding-sibling::payload/name = name)">
            <xsl:copy-of select="."/>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...