2011-03-14 18 views
7

içinde aşağıdaki gibidir (örnek) içeren bir değişken olarak adlandırılır satırlar göz önüne alındığında (XSLT 1.0.):XSL deposu düğüm tarafından belirlenen değişken

giriş

<AllResults> 
    <Result> 
     <subject>can be filtered by filter 1</subject> 
     <type>can be filtered by filter 2</type> 
     <date>can be filtered by filter 3</date> 
    </Result> 
    <Result> ... 
    </Result> 
</AllResults> 

I 3 filtre değişkenler var. Her filtre için, filtre değişkeni boş değilse, filtreyi yukarıda gösterilen girişe uygulamak istiyorum. Filtrelenen sonucu filtrelerle eşleşen öğeler yeni bir değişkene kaydetmek istiyorum. Aşağıdakileri denedim, ancak bunun hakkında bir hata iletisi (filterResult) "node-set yerine sonuç ağacı" oluyor. Satırlar değişkeni, bir hata ayıklayıcısını kullanarak belirlediğim gibi bir düğüm kümesidir. XSL'in

Bölüm

<xsl:variable name="filterResult"> <xsl:choose> <xsl:when test="$filter1 != '' and $filter2 != '' and $filter3 != ''"> <xsl:copy-of select="$Rows[date=$filter1 and type=$filter2 and subject=$filter3]" /> </xsl:when> <xsl:when test="$filter1 != '' and $filter2 != ''"> <xsl:copy-of select="$Rows[date=$filter1 and type=$filter2]" /> </xsl:when> <xsl:when test="$filter1 != '' and $filter3 != ''"> <xsl:copy-of select="$Rows[date=$filter1 and subject=$filter3]" /> </xsl:when> <xsl:when test="$filter3 != '' and $filter2 != ''"> <xsl:copy-of select="$Rows[type=$filter2 and subject=$filter3]" /> </xsl:when> <xsl:when test="$filter1 != ''"> <xsl:copy-of select="$Rows[date=$filter1]" /> </xsl:when> <xsl:when test="$filter3 != ''"> <xsl:copy-of select="$Rows[subject=$filter3]" /> </xsl:when> <xsl:when test="$filter2 != ''"> <xsl:copy-of select="$Rows[type=$filter2]" /> </xsl:when> <xsl:otherwise> <xsl:copy-of select="$Rows" /> </xsl:otherwise> </xsl:choose> </xsl:variable> 

O kopyalamaya karşı bir sonucudur ağacı ve bir düğüm kümesi üretir farkındayım ama benim 3 filtreler gereksinimi verilen bir düğüm kümesi üretmek için NASIL emin değilim yukarıda tarif ettiğim.

Ek Bilgi

ben mümkün koşulların çok şey var çünkü, bir düğüm ayarlamak ama bu beni nasıl yardımcı görmüyorum içeren bir değişken yaratacak <xsl:variable name="me" select="/set/node"/> gibi bir şey yapabileceğini biliyoruz

(üç filtre verildi).

cevap

7

$Rows değişkeni Result Tree Fragment türünün bir örneğidir.

Sen dize işlemleri dışındaki RTF üzerinde ( [] filtre ifadesi tarafından sağlanan gibi) herhangi bir işlemi gerçekleştirmek olamaz

: http://www.w3.org/TR/xslt#section-Result-Tree-Fragments

gelen bir işlem sonucu ağaç bölümünde izin verilen sadece o işlem eğer Bir dize üzerinde izin verilecektir (dize üzerindeki işlemi, ilk olarak dize bir numaraya veya boole'ye dönüştürmek için) içerebilir. Özellikle, 'un, //, ve [] işleçlerinin sonuç ağacı parçalarında kullanılmasına izin verilmez.

<xsl:variable name="filterResult" 
       select="$Rows[(date=$filter1 or $filter1='') 
           and 
          (type=$filter2 or $filter2='') 
           and 
          (subject=$filter3 or $filter3='')]"/> 

bulunmaktadır XSLT işlemci (çoğunlukla her bir) node-set() uygulamalarını sağlar: $Rows böyle düğüm veri seti türü örneği ise Bunun yanı sıra

, tüm gösterdi kod basitleştirilebilir RTF için node set dönüştürme için uzatma fonksiyonu.

<xsl:variable name="name" select="xpath_expression"/> 

Sen copy-of, apply-templates kullanamazsınız: XSLT 1.0 olarak

+0

"$ Satır değişkeni, Result Tree Fragment türünün bir örneğidir." Öyle değil .. Bir düğüm kümesi olduğu için bir hata ayıklayıcı kullanarak zaten doğruladım. "FilterResult", sonuçta bir ağaç parçası olmaktan çıkıyor ve bunun bir düğüm kümesi olmasını istiyorum. – KyleM

+0

@KyleM: "$ Satırlar" bildirimini veya '$ filterResult' kullanımını izlemediniz. Tahmin edemeyiz. –

+0

Btw, bu, xslt 1.0 'dır. Bu, neyi okuduğuma göre bir düğüm kümesi olarak bir sonuç ağacı parçasını işleyemez. – KyleM

11

, kaynak belgeden düğümler kümesi içeren bir değişken oluşturmak için tek yol select özelliğinde bir XPath ifadesini değerlendirmek gereğidir veya call-template; bunlar sonuçta bir ağaç parçası üretecek.

Her XSLT işlemci Sonuç ağaç parçalarını düğüm kümelerine dönüştüren bir uzantı işlevi uyguladığını biliyorum; bu nedenle, tamamen çapraz bir platform oluşturmak için dönüşümünüze gerek duymadığınız sürece, bunun gibi bir şey yapabilirsiniz (bu örnekte Microsoft'un XSLT'si kullanılmaktadır) işlemci):

<xsl:variable name="filterResultNodeSet" select="msxsl:node-set($filterResult)"/> 

Ama bunu yapabilmesi için gerek yoktur: Alejandro işaret ettiği gibi, sen tek XPath ifadesini yazarak sadece aradığınız sonucu alabilirsiniz. Düğüm seçiminin çok karmaşık olduğu, node-set() işlevini kullanmanız gereken uygulamalar var, ancak sizinkilerden biri değil.

İlgili konular