Frage

Ich habe einige XML, zum Beispiel Zwecke sieht es wie folgt aus:

<root>
    <field1>test</field1>
    <f2>t2</f2>
    <f2>t3</f2>
</root>

Ich wollen, um Sie zu transformieren mit XSLT, aber ich möchte zu unterdrücken, die zweite f2-element in der Ausgabe - wie prüfe ich in meinem template zu sehen, ob die f2-element bereits vorhanden ist, in die ausgegeben wird, wenn das zweite f2-element in den Quelltext verarbeitet wird?Mein XSLT sieht wie folgt zu präsentieren:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="no" omit-xml-declaration="yes" standalone="no" />
  <xsl:template match="/">
    <xsl:for-each select="./root">
      <output>
        <xsl:apply-templates />        
      </output>
    </xsl:for-each>
  </xsl:template>
  <xsl:template match="*" >
      <xsl:element name="{name(.)}">
        <xsl:value-of select="." />
      </xsl:element>
  </xsl:template>
</xsl:stylesheet>

Ich brauche eine Art überprüfen, um die xsl:element in der Vorlage, die ich denke, aber ich bin mir nicht sicher, wie Sie zu verhören, der Ausgang Dokument, um zu sehen, ob das element bereits vorhanden ist.

Edit:Vergessen Sie die pre-tags, code sollte jetzt sichtbar!

War es hilfreich?

Lösung

Es hängt davon ab, wie system-weit Sie sein wollen.

d.h.Sind Sie nur die Elemente, die Kinder von den gleichen Eltern, oder alle Elemente auf der gleichen Ebene ('cousins', wenn Sie möchten) oder die Elemente einer beliebigen Stelle im Dokument...

In der ersten situation, die Sie könnte überprüfen Sie die vorhergehenden-sibling-Achse zu sehen, wenn alle anderen Elemente mit demselben Namen vorhanden sind.

<xsl:if test="count(preceding-sibling::node()[name()=name(current())])=0">
  ... do stuff in here.
</xsl:if>

Andere Tipps

Um nur zu überprüfen (und zu warnen, Sie von ein Duplikat ist), finden Sie möglicherweise ein Beispiel hier

Etwas entlang der Linien von:

<xsl:for-each-group select="collection(...)//@id" group-by=".">
  <xsl:if test="count(current-group()) ne 1">
    <xsl:message>Id value <xsl:value-of select="current-grouping-key()"/> is 
       duplicated in files
       <xsl:value-of select="current-group()/document-uri(/)" separator=" and
    "/></xsl:message>
  </xsl:if>
 </xsl:for-each-group>

Geändert werden, um wählen Sie alle Knoten innerhalb des "root" - element.

Wie zu entfernen Sie die doppelten Zeilen, Sie haben eine andere Beispiel hier

Das würde so Aussehen:

<xsl:stylesheet>
  <xsl:key name="xyz" match="record[x/y/z]" use="x/y/z" />
  <xsl:variable name="noxyzdups" select="/path/to/record[generate-id(.) = generate-id(key('xyz', x/y/z))]" />
...
  <xsl:template ... >
    <xsl:copy-of "exslt:node-set($noxyzdups)" />
  </xsl:template>
</xsl:stylesheet>

x/y/z ist der xpath-Ausdruck, den Sie möchten, einmalig.Es kann sein, concat(x,'-',@y,'-',z) oder was immer Sie wollen.

Jetzt bin ich nicht sicher, ob diese beiden Beispiele kann leicht angepasst werden, um Ihren Fall, aber ich wollte nur darauf hinweisen, diese beiden Quellen, in Fall, dass es hilft.

Es ist nicht möglich, Sie zu verhören, die die Ausgabe Ihres verwandeln.Es ist auch nicht möglich zu verfolgen, den aktuellen Status der Transformation (D. H.verfolgen, welche Knoten Sie haben die in einer Variablen).Grundsätzlich, das ist nicht, wie XSLT funktioniert.Eine der Kosten, die Seite-Effekt-frei Programmier-Umgebung ist, dass man nicht Dinge tun, die Nebenwirkungen haben.Oh well.

In Ihrem Fall eine Möglichkeit dies zu erreichen wäre, zu bauen, eine variable, die eine Liste aller source-Elemente, die könnte umgewandelt werden in das output-element, das Sie wollen zu emittieren nur einmal.Dann prüfen Sie jeden Knoten, den Sie verändert sich anhand dieser Liste.Wenn es nicht in der Liste, emittieren Sie.Wenn es das erste Element in der Liste, emittieren Sie.Sonst nicht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top