我有以下输入:
<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>
我做错什么了?谢谢
不起作用的模板匹配是这个。。。
<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