XSLT - 如果node属性为value,则选择所有节点

时间:2018-01-16 13:14:14

标签: xml xslt

我想选择具有值属性大于阈值的值属性的所有记录。我在$dataset中的数据如下所示:

 <component name="Information Technology" value="5712"/>
 <component name="NADCO" value="5033"/>
 <component name="Electronic Security" value="2104"/>
 <component name="SATT" value="1608"/>
 <component name="E-Business Office" value="291"/>
 <component name="Systems Development" value="158"/>
 <component name="Test" value="694"/>

我还有$threshold,其值为4000。我用来获取值大于4000的组件的代码是:

<xsl:variable name="records" select="$dataset/self::node()[@value &gt; $threshold]"/>

所以我希望records成为组件Information TechnologyNADCO的列表,但变量为空。我哪里做错了?

ps请注意,我没有根节点

修改
制作数据集的代码如下

<xsl:variable name="dataset" select="$components/component" />

$components

<components>
     <component name="Information Technology" value="5712"/>
     <component name="NADCO" value="5033"/>
     <component name="Electronic Security" value="2104"/>
     <component name="SATT" value="1608"/>
     <component name="E-Business Office" value="291"/>
     <component name="Systems Development" value="158"/>
     <component name="Test" value="694"/>
</components>

1 个答案:

答案 0 :(得分:0)

我是通过以下方式做到的:

  1. dataset变量包含components/componentcomponent标签的集合,正如您所做的那样)。

  2. XPath 表达式为$dataset[@value &gt; $threshold],即:

    • $dataset - 变量(记录容器)。
    • [@value &gt; $threshold] - 谓词。
  3. 如您所见,甚至不需要self::node()

    所以整个示例模板匹配main(root)标记 (containig components)如下所示:

    <xsl:template match="@*|node()">
      <xsl:copy>
        <xsl:variable name="dataset" select="components/component"/>
        <xsl:variable name="threshold" select="4000"/>
        <xsl:variable name="records" select="$dataset[@value &gt; $threshold]"/>
        <xsl:copy-of select="$records"/>
      </xsl:copy>
    </xsl:template>
    

    即使在版本1.0 / Xalan中也能正常工作。有关工作示例,请参阅http://xsltransform.net/nb9MWsz