使用 XSLT 过滤 XML 文档的动态 XPath

Dynamic XPath to filter XML documents using XSLT

我已经在 Whosebug 上搜索了一段时间,但没有成功。我的目标是过滤 Employee XML 文档。输入 XML 有大约 9000 名员工,我有多个目标系统,他们希望根据每个目标系统的不同选择标准获得这些员工记录的子集。 示例输入:

<Employees>
  <Employee>
    <id>1</id>
    <name>Name1</name>
  </Employee>
  <Employee>
    <id>2</id>
    <name>Name2</name>
  </Employee>
  <Employee>
    <id>3</id>
    <name>Name3</name>
  </Employee>
  <Employee>
    <id>4</id>
    <name>Name4</name>
  </Employee>
</Employees>

输出应具有相同的结构,但根据选择标准 (XPATH) 减少了节点。 如何将动态 XPath 传递给 XSLT 样式表并将过滤后的员工作为输出? 请注意完整的 Xpath 表达式连同过滤条件 作为一个字符串传递。

期望的输出:

<Employees>
      <Employee>
        <id>2</id>
        <name>Name2</name>
      </Employee>
      <Employee>
        <id>3</id>
        <name>Name3</name>
      </Employee>
 </Employees>

使用 XSLT 3.0,xsl:evaluate 用于动态 XPath 评估。您可以将 XPath 接受为 xsl:param(显示为示例默认 XPath 值),然后对其求值。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
    <xsl:output indent="yes"/>
    
    <xsl:mode on-no-match="shallow-copy"/>
    
    <xsl:param name="path" select="'/Employees/Employee[number(id)[. gt 1 and . lt 4]]'" />
        
    <xsl:template match="Employees">
        <xsl:copy>
            <xsl:evaluate xpath="$path" context-item="."/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>