2013-08-30 42 views
0

我試圖設置一個組合框,使用Saxon-ce的值來過濾xml中項目的顯示。以下是我目前使用的代碼示例。使用Saxon-ce通過組合框顯示已過濾的輸出

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ext="http://exslt.org/common" 
xmlns:ixsl="http://saxonica.com/ns/interactiveXSLT" 
xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
extension-element-prefixes="ixsl"> 

<xsl:template match="/"> 
    <!-- set up combo box --> 
<xsl:result-document href="#typeControl"> 
    <xsl:text>Type: </xsl:text> 
    <select class="menuSub_monster" id="typeBox"> 
     <option value="all" selected="'all'">Unsorted</option> 
     <option value="group">Sorted</option> 
     <option value="value1">Value1</option> 
     <option value="value2">Value2</option> 
    </select> 
</xsl:result-document> 

<!-- inital display --> 
<xsl:call-template name="displayTemplates"> 
    <xsl:with-param name="typeSel" select="'all'"/> 
</xsl:call-template> 
</xsl:template> 

<!-- Change display when we change combo box --> 
<xsl:template match="select[@id='typeBox']" mode="ixsl:onchange"> 
<xsl:variable name="control" select="."/> 
<xsl:variable name="typeValue" select="ixsl:get($control,'value')" /> 

<xsl:call-template name="displayTemplates"> 
    <xsl:with-param name="typeSel" select="$typeValue"/> 
</xsl:call-template> 
</xsl:template> 

<!-- display routine --> 
<xsl:template name="displayTemplates"> 
<xsl:param name="typeSel"/> 
<xsl:result-document href="#display" method="ixsl:replace-content" > 
<xsl:choose> 
    <xsl:when test="$typeSel='all'"> 
    <xsl:for-each select="templates/template"> 
    <xsl:sort select="sort_name"/> 
    ... CODE FOR DISPLAY 
    </xsl:for-each> 
    </xsl:when> 
    <xsl:when test="$typeSel='group'"> 
    ... CODE FOR DISPLAY 
    </xsl:when> 
    <xsl:otherwise> 
    <xsl:for-each select="templates/template/types[type[text()=$typeSel]]"> 
    <xsl:sort select="../sort_name"/> 
      ...CODE FOR DISPLAY 
    </xsl:for-each> 
    </xsl:otherwise> 
</xsl:choose> 
</div> 

</xsl:result-document> 
</xsl:template> 

我遇到的問題是在組合框更改值時調用模板displayTemplates。我轉換到上下文模板/模板不起作用,因爲這是我用這個樣式表調用的XML的一部分。但是,match =「select [@ id ='typeBox']」將上下文設置爲不在XML中的對象。如何將組合框的上下文更改爲我的XML,以便顯示例程中的for-each語句正常工作?

回答

0

一種方法:將變量綁定到XML中的某個節點,從中可以成功導航到需要去的地方。然後使用對該變量的引用將上下文移回到其他文檔。 (可能有更優雅的方法。)

+0

同意。擁有一個全局變量''總是一個好主意,這樣您就可以始終返回主體源文檔而不依賴於上下文。 –

+0

好的。現在完成這個總問題。 我已經按照建議(在樣式表聲明之後)設置了變量,但我不確定如何使用它將顯示模板中的上下文移回。如果我簡單地將for-each改爲,那麼它不起作用。我錯過了什麼? –

+0

根據輸入的形狀,您可能需要像'「來進行迭代。 –