使用存储在Xslt变量中的Xpath

时间:2014-02-26 08:44:27

标签: xml xslt xpath

我有一个XML文件,其属性中包含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我想基于名为A的元素的visibilityCondition来显示或隐藏内容     

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

问题是if条件总是失败,因为$ visibleCondition的值为//element[@name='A']/@selected,而我希望解析XPath并匹配所选属性True中的实际值。 我如何实现这一目标?

2 个答案:

答案 0 :(得分:1)

您无法将已存储在属性中的字符串评估为XPath,这与构建要评估的xpath相同,而不是扩展名。

在您的示例boolean($visibleCondition)中,仅检查@visibilityCondtion属性是否存在,但不会评估存储在属性中的表达式。

您可以查看答案here中关联的撒克逊扩展程序,或查看dyn:evaluate from exslt

答案 1 :(得分: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>

我在http://xsltransform.net/中使用XALAN 2.7.1尝试了它并且它可以正常工作。