当前位置: 首页 > 知识库问答 >
问题:

XSLT模板匹配键值

寇开畅
2023-03-14

我有以下输入:

<root>
    <output>         
            <queries>
                <query name="name1">
                    <parameters>
                        <parameter name="id_contact">8947</parameter>
                    </parameters>
                    <queryResults/>
                </query>
                <query name="name1">
                    <parameters>
                        <parameter name="id_contact">8943</parameter>
                    </parameters>
                    <queryResults>
                        <record id="1">
                            <column name="id_task">16422</column>
                            <column name="id_contact">8943</column>
                        </record>
                    </queryResults>
                </query>
                <query name="name1">
                    <parameters>
                        <parameter name="id_contact">1571</parameter>
                    </parameters>
                    <queryResults/>
                </query>
            </queries>
    </output>
    <output2>
        <output_getquerydata>
            <data>
                <query name="name2">
                    <parameters>
                        <parameter name="id">1</parameter>
                    </parameters>
                    <queryResults>
                        <record id="1">
                            <column name="id_task">14016</column>
                            <column name="id_contact">8947</column>
                        </record>
                        <record id="2">
                            <column name="id_task">14012</column>
                            <column name="id_contact">8943</column>
                        </record>
                        <record id="3">
                            <column name="id_task">8826</column>
                            <column name="id_contact">1571</column>
                        </record>
                    </queryResults>
                </query>
                <output_getquerydata>
                    <queries>
                        <query name="name3">
                            <parameters>
                                <parameter name="id_task">14016</parameter>                             
                            </parameters>
                            <queryResults>
                                <record id="1">
                                    <column name="id_shift">2989</column>
                                </record>
                            </queryResults>
                        </query>
                        <query name="name3">
                            <parameters>
                                <parameter name="id_task">14012</parameter>
                            </parameters>
                            <queryResults/>
                        </query>
                        <query name="name3">
                            <parameters>
                                <parameter name="id_task">8826</parameter>                              
                            </parameters>
                            <queryResults/>
                        </query>
                    </queries>
                </output_getquerydata>
            </data>
        </output_getquerydata>
    </output2>
</root>

我的XSL:

<xsl:strip-space elements="*"/>
<xsl:key name="k" match="output/queries/query/queryResults/record" use="column[@name='id_contact']"/>
<xsl:key name="ok" match="output2/output_getquerydata/data/query/queryResults/record" use="column[@name='id_task']"/>    
<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>
<!-- suppress the first output branch -->
<xsl:template match="output"/>
<!-- suppress records that have a matching entry in the other branch -->
<xsl:template match="record[key('k', column[@name='id_contact'])]"/>
<xsl:template match="parameters[not(key('ok', ./parameter))]"/>

目标是对于每个具有query结果/记录的“query1”,我从该query结果/记录/列[@name='id_contact']中获取值,并从“query2”中删除每个在query2/query结果/记录/列[@name='id_contact']中具有该值的记录。这部分可以工作,但下一部分不能正常工作:然后,在删除query2中的值后,获取剩余的query2/id_task值,并将具有相同值的查询[name3]保留在id_task中。

期望输出:

<root>  
    <output2>
        <output_getquerydata>
            <data>
                <query name="name2">
                    <parameters>
                        <parameter name="id">1</parameter>
                    </parameters>
                    <queryResults>
                        <record id="1">
                            <column name="id_task">14016</column>
                            <column name="id_contact">8947</column>
                        </record> 
                        <!--record no.22 deleted, because id_contact=8943 is a match in query1-->
                        <record id="3">
                            <column name="id_task">8826</column>
                            <column name="id_contact">1571</column>
                        </record>
                    </queryResults>
                </query>
                <output_getquerydata>
                    <queries>
                        <query name="name3">
                            <parameters>
                                <parameter name="id_task">14016</parameter>                             
                            </parameters>
                            <queryResults>
                                <record id="1">
                                    <column name="id_shift">2989</column>
                                </record>
                            </queryResults>
                        </query>
                        <!--2nd query name3 deleted, because id_task=14012 is not a match in remaining query2 values-->

                        <query name="name3">
                            <parameters>
                                <parameter name="id_task">8826</parameter>                              
                            </parameters>
                            <queryResults/>
                        </query>
                    </queries>
                </output_getquerydata>
            </data>
        </output_getquerydata>
    </output2>
</root>

我做错什么了?谢谢

共有1个答案

顾赞
2023-03-14

不起作用的模板匹配是这个。。。

<xsl:template match="parameters[not(key('ok', ./parameter))]"/>

首先,您应该真正匹配查询节点,因为这是您要删除的节点。

其次,模板与输入XML匹配,而不是与输出XML匹配。您可能正在从输出中删除记录,但输入不变,因此这就是将要匹配的内容。

因此,您需要做的是检查query2值是否存在,如果它确实存在,然后检查是否要删除相同的值(即它存在于query1

用这个模板替换上面的模板匹配,看看这是否有区别:

<xsl:template match="queries/query
                     [not(key('ok', parameters/parameter)) 
                      or key('k', key('ok', parameters/parameter)/column[@name='id_contact'])]"/>
 类似资料:
  • 目标 在这一章中,你将学习 使用模板匹配查找图像中的对象 你会学会这些函数:cv2.matchTemplate(),cv2.minMaxLoc() 理论基础 模板匹配是一种在较大图像中搜索和查找模板图像位置的方法。 OpenCV为此提供了一个函数cv2.matchTemplate()。它只是将模板图像滑过输入图像(就像2D卷积那样),并将模板图像和输入图像的一小块进行比较。在OpenCV中实现了几

  • 目标 在本章中,您将学习 使用模板匹配在图像中查找对象 你将看到以下功能:cv.matchTemplate(),cv.minMaxLoc() 理论 模板匹配是一种用于在较大图像中搜索和查找模板图像位置的方法。为此,OpenCV带有一个函数cv.matchTemplate()。 它只是将模板图​​像滑动到输入图像上(就像在2D卷积中一样),然后在模板图像下比较模板和输入图像的拼图。 OpenCV中实

  • 问题内容: 我正在尝试基本上在Java上进行模板匹配。我使用简单的算法来找到匹配项。这是代码: 但这是非常缓慢的方法。我测试了2张图像(768×1280)和子图像(384 x 640)。这持续了很长时间。openCV是否可以使用现成的函数cvMatchTemplate()快速执行模板匹配? 问题答案: 您会发现openCV cvMatchTemplate()比您已实现的方法快得多。您创建的是一种统

  • 问题内容: 我正在使用PostgreSQL 9.4。我的表有一列: 我在JSONB列中根据键/值存储事务。要求之一是从键值中搜索客户名称,因此我正在运行如下查询: 我所做的一切似乎都使查询不喜欢GIN索引。如何使查询使用不区分大小写的模式搜索的GIN索引? 我尝试将列更改为文本,使用为其编制索引,然后搜索所需的文本,然后将结果转换为,然后搜索所需的键/值。这种方法似乎行不通。 问题答案: 默认的G

  • 问题内容: 如何找到具有匹配模式的所有键的计数。 例如,有两个键和。常见的模式是。因此,这里的计数是2。 如何在Redis中做到这一点? 问题答案: 免责声明 我希望这个旧答案不会损坏任何具有数百万把钥匙的生产系统。如果出于某种原因仍要在生产中仍然计算redis的匹配键,最好使用具有匹配模式的scan。 如果仅使用KEYS进行搜索,并使用Redis客户端,您将获得所有匹配密钥的数字列表,对吗? 例

  • 模式匹配,多出现在函数式编程语言之中,为其复杂的类型系统提供一个简单轻松的解构能力。比如从enum等数据结构中取出数据等等,但是在书写上,相对比较复杂。我们来看一个例子: enum Direction { East, West, North, South, } fn main() { let dire = Direction::South; matc