xml - 如果值存在于另一个 xml 列表中,则过滤 XML 记录
问题描述
我有两个 XMLs Main XML 和 List XML。我正在尝试根据两个 XML 上是否存在相同的节点值来过滤主 XML。
尝试了以下 xslt 但未按预期工作。
Xslt
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:output method="xml" omit-xml-declaration="yes" media-type="string"/>
<xsl:param name="cc" select="'list.xml'"/>
<xsl:variable name="list" select="document($cc)/rows/row" />
<xsl:template match="/lines">
<xsl:copy>
<xsl:apply-templates select="/line[substring-before(/account/seg1, ' ')=$list/cc]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
我正在使用 Cast Iron 工具执行此过滤器,它支持 XSLT 2.0
主要的xml:
<lines>
<line>
<account>
<seg1>0101 Expense</seg1>
</account>
</line>
<line>
<account>
<seg1>0102 Capital</seg1>
</account>
</line>
<line>
<account>
<seg1>0103 Expense</seg1>
</account>
</line>
<line>
<account>
<seg1>0104 Expense</seg1>
</account>
</line>
<line>
<account>
<seg1>0105 Espense</seg1>
</account>
</line>
</lines>
清单 XML:
<rows>
<row>
<cc>0101</cc>
</row>
<row>
<cc>0103</cc>
</row>
<row>
<cc>0105</cc>
</row>
<row>
<cc>0107</cc>
</row>
<row>
<cc>0109</cc>
</row>
</rows>
输出 XML:
<lines>
<line>
<account>
<seg1>0101</seg1>
</account>
</line>
<line>
<account>
<seg1>0103</seg1>
</account>
</line>
<line>
<account>
<seg1>0105</seg1>
</account>
</line>
</lines>
EDIT1:添加了我正在尝试的 xslt 和 inputxml 更多信息。
解决方案
声明一个键<xsl:key name="ref" match="row/cc" use="."/>
,然后使用身份转换模板加上一个空模板
<xsl:template match="line[not(key('ref', account/seg1, doc('list.xml')))]"/>
编辑后,您大幅更改了输入结构,我认为如果您将空模板更改为,建议的方法应该仍然有效
<xsl:template match="line[not(key('ref', substring-before(account/seg1, ' '), doc('list.xml')))]"/>
推荐阅读
- python - 我如何使这个功能工作?我有一个指定流派的歌曲列表,我想显示最受欢迎的流派
- matlab - 如何将 9x9 矩阵分解为 3x3 矩阵?
- java - 不同的 OSGi 部署包可以使用相同类型的资源吗?
- node.js - 使用 Pug 和 expressjs 路由,CSS 不会显示和图像不会加载,但数据在那里
- python - 使用递归函数展平
- groovy - 尝试解压缩以前下载的文件时,Groovy 抛出文件未找到
- php - 几次尝试后,Woocommerce 结帐重定向无法按预期工作
- javascript - 如何使用 google my business api 获取帐户详细信息列表?
- react-native - 创建具有特定版本的 expo 项目
- python - 如何让这个 python 代码更高效?