XSLT 模板匹配键值

XSLT template match key value

我有以下输入:

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

目标是针对具有 queryResults/record 的每个 'query1',我从 queryResults/record/列 [@name='id_contact'] 中获取值并删除每条记录来自 "query2",在 query2/queryResults/record/column[@name='id_contact'] 中具有该值。这部分有效,但下一部分不起作用: 然后,在删除 query2 的值​​后,取剩余的 query2/id_task 值并保留在 id_task.

中具有相同值的 query[name3]

期望的输出:

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

首先,您确实应该匹配 query 节点,因为这是您要删除的节点。

其次,模板匹配输入 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'])]"/>