2015-11-11 5 views
1

Я пытаюсь решить проблему, когда я хочу удалить повторяющиеся значения из последовательности элементов.Удаление повторяющихся элементов с использованием отдельных значений и xslt 2.0

Я играл с этим на некоторое время теперь, и код ниже своего рода выглядит как-то я думал, что будет работать, но я получаю сообщение об ошибке:

XPTY0020: Ведущий «/» не сможете выбрать корневой узел дерева, содержащего элемент контекста: контекст элемент не является узлом

XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0"> 
    <xsl:strip-space elements="*"/> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/"> 

     <xsl:for-each select="distinct-values(/tobject/tobject.subject/@tobject.subject.refnum)"> 
      <xsl:copy-of select="."/> 
     </xsl:for-each> 

    </xsl:template> 
</xsl:stylesheet> 

XML-:

<?xml version="1.0" encoding="UTF-8"?> 
<tobject tobject.type="Utenriks"> 
    <tobject.property tobject.property.type="Nyheter"/> 
    <tobject.subject tobject.subject.code="OKO" tobject.subject.refnum="04000000" tobject.subject.type="økonomi og næringsliv"/> 
    <tobject.subject tobject.subject.code="OKO" tobject.subject.refnum="04000000" tobject.subject.type="økonomi og næringsliv"/> 
    <tobject.subject tobject.subject.code="OKO" tobject.subject.refnum="04000000" tobject.subject.type="økonomi og næringsliv"/> 
    <tobject.subject tobject.subject.code="OKO" tobject.subject.refnum="04005000" tobject.subject.matter="olje og energi"/> 
    <tobject.subject tobject.subject.code="OKO" tobject.subject.refnum="04000000" tobject.subject.type="økonomi og næringsliv"/> 
    <tobject.subject tobject.subject.code="POL" tobject.subject.refnum="11000000" tobject.subject.type="politikk"/> 
    <tobject.subject tobject.subject.code="OKO" tobject.subject.refnum="04000000" tobject.subject.type="økonomi og næringsliv"/> 
    <tobject.subject tobject.subject.code="POL" tobject.subject.refnum="11000000" tobject.subject.type="politikk"/> 
    <tobject.subject tobject.subject.code="POL" tobject.subject.refnum="11003000" tobject.subject.matter="valg"/> 
    <tobject.subject tobject.subject.code="KRE" tobject.subject.refnum="02000000" tobject.subject.type="kriminalitet og rettsvesen"/> 
    <tobject.subject tobject.subject.code="FRI" tobject.subject.refnum="10000000" tobject.subject.type="fritid"/> 
</tobject> 

Требуемая результат:

<?xml version="1.0" encoding="UTF-8"?> 
<tobject tobject.type="Utenriks"> 
    <tobject.property tobject.property.type="Nyheter"/> 
    <tobject.subject tobject.subject.code="OKO" tobject.subject.refnum="04000000" tobject.subject.type="økonomi og næringsliv"/> 
    <tobject.subject tobject.subject.code="OKO" tobject.subject.refnum="04005000" tobject.subject.matter="olje og energi"/> 
    <tobject.subject tobject.subject.code="POL" tobject.subject.refnum="11000000" tobject.subject.type="politikk"/> 
    <tobject.subject tobject.subject.code="POL" tobject.subject.refnum="11003000" tobject.subject.matter="valg"/> 
    <tobject.subject tobject.subject.code="KRE" tobject.subject.refnum="02000000" tobject.subject.type="kriminalitet og rettsvesen"/> 
    <tobject.subject tobject.subject.code="FRI" tobject.subject.refnum="10000000" tobject.subject.type="fritid"/> 
</tobject> 

ответ

1

the code below sort of looks like something I thought would work, but I am getting an error:

XPTY0020: Leading '/' cannot select the root node of the tree containing the context item: the context item is not a node

Эта ошибка не может быть воспроизведен работает ваш код - см: http://xsltransform.net/gWvjQfa

Однако результат distinct-values() последовательность значений, а не узлов. Результат, который вы ожидаете - удаление дубликатов элементов - гораздо легче достичь с помощью группирования:

XSLT 2,0

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

<xsl:template match="/tobject"> 
    <xsl:copy> 
     <xsl:copy-of select="@* | tobject.property"/> 
     <xsl:for-each-group select="tobject.subject" group-by="@tobject.subject.refnum"> 
      <xsl:copy-of select="current-group()[1]"/> 
     </xsl:for-each-group> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 
0

I. Еще короче решение, что является чисто XSLT 1.0 и не нуждается в ненужных именах элементов.

Кроме того, он не менее эффективен, чем XSLT 2.0 решение, которое использует <xsl:for-each-group> - потому что здесь мы используем Muenchian метод группировки:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 
<xsl:key name="kOS" match="tobject.subject" use="@tobject.subject.refnum"/> 

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

    <xsl:template match= 
    "tobject.subject[generate-id() != generate-id(key('kOS', @tobject.subject.refnum)[1])]"/> 
</xsl:stylesheet> 

Когда это преобразование применяется на поставленном XML документ:

<tobject tobject.type="Utenriks"> 
    <tobject.property tobject.property.type="Nyheter"/> 
    <tobject.subject tobject.subject.code="OKO" tobject.subject.refnum="04000000" tobject.subject.type="økonomi og næringsliv"/> 
    <tobject.subject tobject.subject.code="OKO" tobject.subject.refnum="04000000" tobject.subject.type="økonomi og næringsliv"/> 
    <tobject.subject tobject.subject.code="OKO" tobject.subject.refnum="04000000" tobject.subject.type="økonomi og næringsliv"/> 
    <tobject.subject tobject.subject.code="OKO" tobject.subject.refnum="04005000" tobject.subject.matter="olje og energi"/> 
    <tobject.subject tobject.subject.code="OKO" tobject.subject.refnum="04000000" tobject.subject.type="økonomi og næringsliv"/> 
    <tobject.subject tobject.subject.code="POL" tobject.subject.refnum="11000000" tobject.subject.type="politikk"/> 
    <tobject.subject tobject.subject.code="OKO" tobject.subject.refnum="04000000" tobject.subject.type="økonomi og næringsliv"/> 
    <tobject.subject tobject.subject.code="POL" tobject.subject.refnum="11000000" tobject.subject.type="politikk"/> 
    <tobject.subject tobject.subject.code="POL" tobject.subject.refnum="11003000" tobject.subject.matter="valg"/> 
    <tobject.subject tobject.subject.code="KRE" tobject.subject.refnum="02000000" tobject.subject.type="kriminalitet og rettsvesen"/> 
    <tobject.subject tobject.subject.code="FRI" tobject.subject.refnum="10000000" tobject.subject.type="fritid"/> 
</tobject> 

разыскиваемый, правильный результат получается:

<tobject tobject.type="Utenriks"> 
    <tobject.property tobject.property.type="Nyheter"/> 
    <tobject.subject tobject.subject.code="OKO" tobject.subject.refnum="04000000" tobject.subject.type="økonomi og næringsliv"/> 
    <tobject.subject tobject.subject.code="OKO" tobject.subject.refnum="04005000" tobject.subject.matter="olje og energi"/> 
    <tobject.subject tobject.subject.code="POL" tobject.subject.refnum="11000000" tobject.subject.type="politikk"/> 
    <tobject.subject tobject.subject.code="POL" tobject.subject.refnum="11003000" tobject.subject.matter="valg"/> 
    <tobject.subject tobject.subject.code="KRE" tobject.subject.refnum="02000000" tobject.subject.type="kriminalitet og rettsvesen"/> 
    <tobject.subject tobject.subject.code="FRI" tobject.subject.refnum="10000000" tobject.subject.type="fritid"/> 
</tobject> 

II. Один вкладыш XPath 2.0 выражение, которое выбирает требуемые уникально (по одному от каждой группы элементов

$vElems[index-of($vElems/@tobject.subject.refnum, @tobject.subject.refnum)[1]] 

Здесь $ должны быть определены, как vElems:

/*/tobject.subject 

Когда это XPath-2.0 оценивается на предоставленном XML-документе, выбирается желаемая последовательность элементов:

<tobject.subject tobject.subject.code="OKO" tobject.subject.refnum="04000000" 
      tobject.subject.type="økonomi og næringsliv"/> 
<tobject.subject tobject.subject.code="OKO" tobject.subject.refnum="04005000" 
      tobject.subject.matter="olje og energi"/> 
<tobject.subject tobject.subject.code="POL" tobject.subject.refnum="11000000" 
      tobject.subject.type="politikk"/> 
<tobject.subject tobject.subject.code="POL" tobject.subject.refnum="11003000" 
      tobject.subject.matter="valg"/> 
<tobject.subject tobject.subject.code="KRE" tobject.subject.refnum="02000000" 
      tobject.subject.type="kriminalitet og rettsvesen"/> 
<tobject.subject tobject.subject.code="FRI" tobject.subject.refnum="10000000" 
      tobject.subject.type="fritid"/> 
Смежные вопросы