3 Stimmen

XSL: Wie wählt man einen eindeutigen Knoten in einem Nodeset aus?

Ich habe auf der anderen Frage über die Auswahl eindeutiger Knoten in einem Dokument (mit der Muenchian-Methode) gelesen, aber in meinem Fall kann ich keine Schlüssel verwenden (oder ich weiß nicht, wie), weil ich auf einem Knotensatz und nicht auf dem Dokument arbeite.

Und Schlüssel können nicht auf ein Node-Set gesetzt werden. Im Grunde habe ich eine Variable:

<xsl:variable name="limitedSet" select="
  $deviceInstanceNodeSet[position() &lt;= $tableMaxCol]" 
/>

die Folgendes enthält <deviceInstance> Knoten, die ihrerseits <structure> Elemente kann die Knotenmenge auf diese Weise dargestellt werden:

<deviceInstance name="Demux TSchannel" deviceIndex="0">
  <structure name="DemuxTschannelCaps">
  </structure>
</deviceInstance>
<deviceInstance name="Demux TSchannel" deviceIndex="1">
  <structure name="DemuxTschannelCaps">
  </structure>
</deviceInstance>
<deviceInstance name="Demux TSchannel" deviceIndex="3">
  <structure name="otherCaps">
  </structure>
</deviceInstance>

Und ich weiß nicht, eine zu wählen <structure> Elemente, die nur einen anderen Namen haben. Der Select würde in diesem Beispiel zwei <structure> Elemente zu sein:

<structure name="DemuxTschannelCaps"></structure>
<structure name="otherCaps"></structure>

Ich habe versucht

select="$limitedSet//structure[not(@name=preceding::structure/@name)]"  

aber die vorhergehende Achse erstreckt sich über das gesamte Dokument und nicht über die $limitedSet ?

Ich komme nicht weiter, kann mir jemand helfen? Ich danke Ihnen.

3voto

Tomalak Punkte 320467
<xsl:variable name="structure" select="$limitedSet//structure" />

<xsl:for-each select="$structure">
  <xsl:variable name="name" select="@name" />
  <xsl:if test="generate-id() = generate-id($structure[@name = $name][1])">
    <xsl:copy-of select="." />
  </xsl:if>
</xsl:for-each>

Dies könnte durch einen Schlüssel unterstützt werden:

<xsl:key name="kStructureByName" match="structure" use="@name" />
<!-- ... -->
<xsl:if test="generate-id() = generate-id(key('kStructureByName', $name)[1])">

Je nach Ihren Eingaben müsste der Schlüssel einige zusätzliche Kontextinformationen erfassen:

<xsl:key name="kStructureByName" match="structure" use="
  concat(ancestor::device[1]/@id, ',', @name)
" />
<!-- ... -->
<xsl:variable name="name" select="concat(ancestor::device[1]/@id, ',', @name)" />
<xsl:if test="generate-id() = generate-id(key('kStructureByName', $name)[1])">

1voto

Pavel Minaev Punkte 97251
select="$limitedSet//structure[not(@name=preceding::structure[count($limitedSet) = count($limitedSet | ..)]/@name)]"

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X