2011-03-14 126 views
7

假定給出變量稱爲行,其包含以下(實施例)(XSLT 1.0。):XSL存儲節點集合中可變

輸入

<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> 

我有3名濾波器的變量。對於每個過濾器,如果過濾器變量不爲空,我想將過濾器應用於上面顯示的輸入。我想將篩選結果(匹配篩選器的項目)存儲到新變量中。我嘗試了以下,但我得到了關於它的錯誤消息(filterResult)是「結果樹而不是節點集」。行變量是一個節點集,正如我通過使用調試器所確定的那樣。在XSL的

部分

<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> 

我意識到複製的產生結果樹,而不是一個節點集,但我不知道給我的3個濾波器的需求如何產生一個節點集我上面描述過。

附加信息

我知道我可以做類似<xsl:variable name="me" select="/set/node"/>這將創建一個包含節點設置,但我不知道怎麼幫助我,因爲我有很多可能的條件變量(給定三個過濾器)。

回答

7

它看起來像$Rows變量是Result Tree Fragment類型的一個實例。

不能執行任何操作(由像濾波器[]表達提供的那一個)上RTF比字符串操作其他:從http://www.w3.org/TR/xslt#section-Result-Tree-Fragments

的操作被允許在結果 樹片段僅當該操作(字符串上的 操作可能涉及 首先將字符串轉換爲 數字或布爾值)。特別是, 不允許在結果樹 片段上使用/,//, 和[]運算符。 (主要是每一個)

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

有XSLT處理器提供的node-set()實現:

除此之外,如果$Rows是這樣的節點中設置的數據類型的一個實例中的所有顯示碼可以簡化用於RTF到節點集轉換的擴展功能。

+0

「它看起來像$ Rows變量是類型結果樹片段的一個實例。」它不是..我已經使用調試器驗證過它是節點集。然而,「filterResult」最終是一個結果樹片段,我希望它是一個節點集。 – KyleM 2011-03-14 18:35:34

+0

@KyleM:你沒有顯示'$ Rows'聲明,也沒有顯示'$ filterResult'的用法。我們無法猜測。 – 2011-03-14 18:40:49

+0

順便說一句,這是xslt 1.0,它不能根據我讀過的內容將結果樹片段作爲節點集處理。 – KyleM 2011-03-14 18:41:24

11

在XSLT 1.0,以創建包含一組節點從源文檔的可變的唯一方法是通過在select屬性評估XPath表達式:

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

不能使用copy-ofapply-templates ,或call-template;那些將會產生一個結果樹片段。我知道每個XSLT處理器都實現了一個擴展函數,它將結果樹片段轉換爲節點集,所以除非你需要你的變換完全跨平臺,否則你可以做這樣的事情(這個例子使用微軟的XSLT處理器):

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

但你並不需要連這個做:爲亞歷杭德羅指出,你可以得到你正在寫一個XPath表達式尋找只是結果。有些應用程序的節點選擇非常複雜,您必須使用node-set()函數,但是您不是其中之一。