2016-09-26 2 views
0

Suche habe ich ein XML-Dokument mit IDs an Elementen, zum Beispiel:XSLT Leistung beim gesamten Dokument für Id

<Section> 
    <Field Id="1">... content ...</Field> 
    <Field Id="2">... content ...</Field> 
    <Section> 
     <Field Id="5">... content ...</Field> 
     <Field Id="6">... content ...</Field> 
     <Section> 
      <Field Id="10">... content ...</Field> 
      <Field Id="20">... content ...</Field> 
     ... 
     </Section> 
    ... 
    </Section> 
... 
</Section> 

Die eigentlichen Dokumente viele verschachtelten Abschnitte und Felder haben. Ist eine Suche nach einem bestimmten Id ausgeführt einen XPath-Ausdruck verwendet wie:

//Field[@Id=$vSearchId] 

möglicherweise eine teuere Operation? $vSearchId stellt hier eine Variable im XSL-Stylesheet dar, die die Id-Suche enthält.

Gibt es effizientere Möglichkeiten, eine solche Suche durchzuführen, z. B. einen Index erstellen? Ich schaute auf xsl:key, aber ich war nicht sicher, wie man es für eine Suche über das gesamte Dokument verwendet.

Antwort

2

Ich sah xsl:key aber ich war nicht sicher, wie es über das gesamte Dokument für eine Suche zu verwenden.

Gefällt mir das?

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

<xsl:key name="fld" match="Field" use="@Id" /> 
<xsl:variable name="vSearchId">6</xsl:variable> 

<xsl:template match="/"> 
    <xsl:copy-of select="key('fld', $vSearchId)"/> 
</xsl:template> 

</xsl:stylesheet> 
+0

Ist es möglich, eine Funktion zu definieren, die den von der Vorlage abgeglichenen Knoten zurückgibt? – dave

+0

@dave Ich fürchte, ich folge nicht. –

+0

Ihr Ansatz funktioniert, ignorieren Sie meinen Kommentar. – dave

1

Sie könnten einen Schlüssel definieren: <xsl:key name="id-register" match="Field" use="@Id"/>

Danach können Sie mit dieser Taste Vorkommen von <Field> mit einem bestimmten Id zu verarbeiten:

<xsl:for-each select="key('id-register','10')"> <!-- Do Stuff --> </xsl:for-each>

1

Ist eine Suche nach einem bestimmten Id ausgeführt unter Verwendung eines XPath-Ausdrucks wie zum Beispiel:

//Field[@Id=$vSearchId] 

potenziell teuer?

Ja, es ist möglicherweise teuer. Aber nur potentiell. Bei vielen Prozessoren beschleunigt das Definieren einer xsl:key und die Verwendung der key()-Funktion diese Abfrage (durch Erstellen eines Index). Aber ein Prozessor wie Saxon-EE mit einem intelligenten Optimierer wird den Index automatisch erstellen, ohne dass Sie explizit danach fragen.

Verwandte Themen