2014-02-26 21 views
1

我有一個XML文件,其屬性中包含XPath字符串。事情是這樣的 -
使用存儲在Xslt變量中的Xpath


    <root> 
    <element name="A" visible="True" text="Display Text " selected="True" /> 
    <element name="B" visible="True" text="DisplayText" visibilityCondition="//element[@name='A']/@selected" /> 
    </root> 

現在,使用XSLT我想根據的visibilityCondition以顯示或隱藏內容元素命名爲A.即

    <xsl:for-each select="element"> 
    <xsl:variable name="visibleCondition" select="@visibilityCondition" /> 
    <xsl:choose> 
     <xsl:when test="boolean($visibleCondition)"> 
     <xsl:when test="$visibleCondition"> 
     <xsl:if test="$visibleCondition='True'"> 
     ... 
     </xsl:if> 
     <xsl:otherwise> 
     ... 
     </xsl:otherwise> 
     </xsl:when> 
     </xsl:choose> 
    </xsl:foreach> 

問題是如果條件永遠失敗以來,$ visibleCondition具有值 //element[@name='A']/@selected而我想獲得XPath解析並匹配所選屬性中的實際值,即 True。 我該如何去做到這一點?

+1

請張貼XML更加小心。 「B」元素的'name'屬性的值沒有開始引號,'visibilityCondition'屬性不是有效的XPath表達式。 –

+0

謝謝Mathias。我現在糾正了Xml。 –

+0

你想要做什麼似乎是評估存儲在visibilityCondition屬性中的字符串爲xpath,這本來就不可能。這裏是一個類似的問題,我發現谷歌搜索[ XSLT:如何評估XSL構建的XPath表達式](http://stackoverflow.com/questions/9565358/solved-xslt-how-to-eval-an-xsl-constructed- xpath-expression) –

回答

1

您無法評估您在屬性中存儲爲XPath的字符串,這與您構建想要評估的xpath相同,無需擴展名。

在您的示例中,boolean($visibleCondition)將只檢查@visibilityCondtion屬性是否存在,但不會評估存儲在該屬性中的表達式。

您可以檢查回答here中鏈接的撒克遜分機,或查看dyn:evaluate from exslt

+0

我可以在.NET(C#)中使用此擴展嗎?我無法從網站中找出它。 –

+2

這可能是照亮:http://stackoverflow.com/questions/2455910/implementing-exslt-dynamic-evaluate-in-c-sharp-xslcompiledtransform –

+0

@Tobias,謝謝。我最終爲XSLT寫了一個擴展。我受http://msdn.microsoft.com/en-us/library/tf741884(v=vs.110).aspx指導。 –

1

此樣式表使用EXSLT動態,但是,這不適用於使用saxon處理器。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:dyn="http://exslt.org/dynamic" 
    extension-element-prefixes="dyn" 
    version="1.1"> 

    <xsl:template match="root"> 

    <xsl:for-each select="element"> 
     <xsl:variable name="visibleCondition" select="@visibilityCondition" /> 
     <xsl:if test="dyn:evaluate($visibleCondition)='True'"> 
       SuCcEsS! 
     </xsl:if> 
     </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 

我XALAN 2.7.1 http://xsltransform.net/嘗試過了,它的工作原理。

+1

在Saxon中,您可以使用XSLT 3.0草案規範中出現的官方xsl:evaluate指令。 saxon:evaluate()擴展函數暫時仍然可用。 –