2016-06-06 16 views
1

Ich versuche, eine XLST 1.0-Datei zu ändern, und ich fand, dass ich ein Array wie folgt verwendet werden:XSLT COUNT Elemente in Array

<xsl:variable name="array"> 
    <Item>106</Item> 
    <Item>107</Item> 
    </xsl:variable> 

Jetzt möchte ich eine IF-Struktur schreiben, wo ich einen Test haben über die Anzahl der Elemente im Array.

I'v versuchte dies, aber das funktioniert nicht:

<xsl:if test="count($array) = 0"></xsl:if> 

Bin ich für dieses Problem des richtigen Ansatz?

+0

Was genau wollen Sie mit der Zählung zu tun? Siehst du, ob es nicht Null ist? Etwas zwischen '' und '' tun? Was meinst du mit "es funktioniert nicht"? Bitte sei genauer, bearbeite die Frage entsprechend meiner Fragen. –

+0

Ich habe dies so gut wie möglich beantwortet, aber ich bin verwirrt: Wenn du die Variablenwerte hart in das Stylesheet codierst, warum musst du die Items zählen drin? –

Antwort

3

Zuerst gibt es keine "Arrays" in XML.

Als nächstes gibt count($array) in Ihrem Beispiel immer 1 zurück, da Ihre Variable einen einzelnen übergeordneten Knoten enthält. Um die untergeordneten Knoten Item zu zählen, müssten Sie count($array/Item) verwenden.

jedoch, dass auch fehlschlagen würde, weil in XSLT 1.0 Ihre Variable enthalten ein Ergebnis Baum-Fragment - und XSLT 1.0 kann nur Knoten zählt in einer Knotenmenge.

Eine Lösung besteht darin, die RTF mithilfe einer Erweiterungsfunktion (die von praktisch allen XSLT 1.0-Prozessoren unterstützt wird) in eine Knotengruppe umzuwandeln. Zum Beispiel kann das folgende Stylesheet:

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

<xsl:variable name="array-rtf"> 
    <Item>106</Item> 
    <Item>107</Item> 
</xsl:variable> 

<xsl:variable name="array" select="exsl:node-set($array-rtf)" /> 

<xsl:template match="/"> 
    <test> 
     <xsl:value-of select="count($array/Item)"/> 
    </test> 
</xsl:template> 

</xsl:stylesheet> 

kehrt:

<?xml version="1.0" encoding="UTF-8"?> 
<test>2</test> 

Eine weitere Option ist ein internes Element anstelle einer Variablen zu verwenden:

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

<my:array> 
    <Item>106</Item> 
    <Item>107</Item> 
</my:array> 

<xsl:template match="/"> 
    <test> 
     <xsl:value-of select="count(document('')/*/my:array/Item)"/> 
    </test> 
</xsl:template> 

</xsl:stylesheet> 
+0

Ich habe den ersten Ansatz verwendet, und es funktioniert wie erwartet. Vielen Dank für Ihre Hilfe! – Jensdc