xslt - 根据子元素过滤记录
问题描述
我需要empinfo.class ='S'
使用任何其他过滤记录并排除记录empinfo.class
(应排除包括其子项在内的完整记录)。
我使用的 XSLT 代码也向我返回了一个empinfo.class='S'
但另一个的记录empinfo.class
(不是预期的)
输入xml:
<Root>
<Record>
<emp>
<empid>1</empid>
...
<empInfo>
<class>S</class>
...
</empInfo>
<empInfo>
<class>G</class>
...
</empInfo>
<empInfo>
<class>G</class>
...
</empInfo>
</emp>
</Record>
<Record>
<emp>
<empid>2</empid>
...
<empInfo>
<class>S</class>
...
</empInfo>
<empInfo>
<class>G</class>
...
</empInfo>
</emp>
</Record>
<Record>
<emp>
<empid>3</empid>
...
<empInfo>
<class>S</class>
...
</empInfo>
</emp>
</Record>
</Root>
XSLT 代码:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="Root">
<xsl:copy>
<xsl:copy-of select="Record[emp/empInfo/class='G'
and emp/empInfo/class ='S']"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
预期输出 xml:
<Root>
<Record>
<emp>
<empid>3</empid>
...
<empInfo>
<class>S</class>
...
</empInfo>
</emp>
</Record>
</Root>
解决方案
试试这个模板
<xsl:template match="Root">
<xsl:copy>
<xsl:for-each select="Record/emp">
<xsl:if test="count(empInfo[class != 'S']) = 0">
<Record>
<xsl:copy-of select="." />
</Record>
</xsl:if>
</xsl:for-each>
</xsl:copy>
</xsl:template>
输出
<Root>
<Record>
<emp>
<empid>3</empid>
<empInfo>
<class>S</class>
</empInfo>
</emp>
</Record>
</Root>
推荐阅读
- hadoop - 由于 own_task_failure,配置单元 regexp_extract 顶点失败
- llvm - llvm 别名可以用于模块间还是仅用于模块内?
- android - HttpClient 超时和 CancelationToken 不起作用
- jenkins - 在 Jenkins Pipeline 脚本上找不到 AWS CLI 和 SAM CLI(Jenkins 作为 Docker 实例运行)
- python - python函数可选参数并跳过或不跳过它们
- .htaccess - .htaccess 从非 www http 子文件夹重定向到 www https 子文件夹
- javascript - 在 JavaScript 中生成对象的随机矩阵的问题
- mysql - docker-compose,NodeJS 在 MYSQL 之前启动,即使使用 depends_on
- xcode - UISegmentedControl 不能再使用 IOS 13 Objective C 设置背景颜色
- laravel - Laravel 6 Backpack 4.0:如何在 FormRequest 类中获取当前页面 ID,或者我可以在不使用 FormRequest 类的情况下获得吗?