我正在尝试使用 xslt 2.0 在 Saxon-ce 中使用 ixsl:eval() 评估动态 xpath,但似乎无法正常工作。这是说明性的 XML
<things>
<thing>
<name>widget one</name>
<number>10</number>
<type>metal</type>
<subtypes>
<subtype>red<subtype>
</subtypes>
</thing>
<thing>
<name>widget two</name>
<number>11</number>
<type>wood</type>
<subtypes>
<subtype>red</subtype>
<subtype>blue</subtype>
</subtypes>
</thing>
</things>
以及我正在尝试评估的 xsl 2.0 样式表的一部分(各种参数由较大的 xsl 样式表的另一部分传递)
<template name="display" match="things">
<xsl:param name="num"/>
<xsl:param name="type" as="xs:string"/>
<xsl:param name="subtype" as="xs:string"/>
<xsl:variable name="xpathExp" as="xs:string">
<xsl:text>things/thing</xsl:text>
<xsl:if test="not($num = 'all')>
<xsl:copy-of select="concat('[number=',$num,']')"/>
</xsl:if>
<xsl:if test="not($type = 'all')>
<xsl:copy-of select="concat('[type=''',$type,''']')"/>
</xsl:if>
<xsl:if test="note($subtype = 'all')>
<xsl:copy-of select="concat('[subtype/subtypes=''',$subtype,''']')/>
</xsl:if>
</xsl:variable>
<xsl:result-document href="#display" method="ixsl:replace-content">
<xsl:for-each select="ixsl:eval($xpathExp)">
<xsl:sort select="name"/>
</xsl:for-each>
</template>
当我用显式 xpath 语句替换 eval 语句时,代码可以工作,因此由于某种原因,$xpathExp 上的 eval 不起作用。想法?
* 编辑 * 这是一个更好的 XML 示例:
<things>
<thing>
<name>widget one</name>
<number>10</number>
<type>metal</type>
<subtypes>
<subtype>red<subtype>
</subtypes>
</thing>
<thing>
<name>widget two</name>
<number>11</number>
<type>wood</type>
<subtypes>
<subtype>red</subtype>
<subtype>blue</subtype>
</subtypes>
</thing>
<thing>
<name>widget three</name>
<number>11</number>
<type>metal</type>
<subtypes>
<subtype>blue</subtype>
</subtypes>
</thing>
</things>
用户可以通过数字、类型和子类型的下拉框选择值。根据用户的选择,将显示事物名称列表。例如,如果用户选择数字 11 和红色子类型,它只会显示小部件 2。如果他们选择蓝色的子类型,它将显示小部件二和三的名称。
所以基本的 xpath 过滤器是 things/thing。如果用户选择一个数字值,我想将 [number=$num] 附加到 xpath 表达式,因此 ti 将是 things/thing[number=$num]。如果他们选择了多个项目,比如说数字和类型,[number=$num][type=$type] 将被附加到基本 xpath 并且我将拥有 things/thing[number=$num][type=$类型]。
基本上,我试图避免的是必须单独编码所有可能的排列和可能的用户选择的组合。
这有帮助吗?