【问题标题】:Filter XML records if the value exists on another xml list如果值存在于另一个 xml 列表中,则过滤 XML 记录
【发布时间】:2019-12-03 02:10:03
【问题描述】:

我有两个 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 的更多信息。

【问题讨论】:

    标签: xml xslt xslt-2.0 cast-iron


    【解决方案1】:

    声明一个键&lt;xsl:key name="ref" match="row/cc" use="."/&gt;,然后使用恒等转换模板加一个空模板

    <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')))]"/>
    

    【讨论】:

    • 试过了,无法正常工作,请检查问题,进行一些相关的编辑。
    • @sandeepkairamkonda,我已尝试根据您编辑的输入数据调整我的建议。至于您现在在编辑中显示的 XSLT,如果您没有显示任何带有名为 invoice-headers 的元素的输入示例,我不知道您为什么要编写 template match="/invoice-headers。所以不知道这意味着什么。
    • 抱歉,我复制了不同的xslt,实际输入的数据非常复杂,我在这里使用了更简单的xml。
    猜你喜欢
    • 2020-10-23
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-21
    • 2020-07-19
    • 1970-01-01
    相关资源
    最近更新 更多