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'])]"/>
我有以下输入:
<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'])]"/>