我有一个带变更跟踪的XML。
目标:如果XML文件由元素CT="ACCEPT"
组成,则使用<atict:add>
接受/打印所有标记并忽略<atict:del>
。 -if XML文件由元素CT="REJECT"
组成,然后使用<atict:del>
接受/打印所有标记并忽略<atict:accept>
。
但是,如果XML不包含任何CT元素,那么它应该相应地插入ADD
和DEL
元素(只有<atict:add>
和<atict:del>
存在。
我能够实现问题的第一部分而不是第二部分。
示例XML:
<?xml version="1.0" encoding="UTF-8"?>
<DM xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:atict="http://www.arbortext.com/namespace/atict" CT="ACCEPT">
<PARA>abcd <atict:del>efghi</atict:del><atict:add>1456790
</atict:add></PARA>
</DM>
XSLT 1.0:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:atict="http://www.arbortext.com/namespace/atict">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="atict:del[ancestor::DM/@CT='ACCEPT']"/>
<xsl:template match="atict:add[ancestor::DM/@CT='REJECT']"/>
<xsl:template match="atict:add">
<xsl:element name="ADD">
<xsl:value-of select='.'/>
</xsl:element>
</xsl:template>
<xsl:template match="atict:del">
<xsl:element name="DEL">
<xsl:value-of select='.'/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
问题是当CT元素存在时我得到ADD/DEL
元素。当结果XML中存在ADD
或DEL
元素时,我不需要CT=ACCEPT
,CT=REJECT
元素。
如果可能的话,请你帮我一个条件。
感谢您的帮助。
答案 0 :(得分:1)
类似的东西:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:atict="http://www.arbortext.com/namespace/atict">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="atict:del[ancestor::DM/@CT='ACCEPT']"/>
<xsl:template match="atict:add[ancestor::DM/@CT='REJECT']"/>
<xsl:template match="atict:add[ancestor::DM/@CT='ACCEPT']">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="atict:del[ancestor::DM/@CT='REJECT']">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="atict:add[not(ancestor::DM/@CT)]">
<xsl:element name="ADD">
<xsl:value-of select='.'/>
</xsl:element>
</xsl:template>
<xsl:template match="atict:del[not(ancestor::DM/@CT)]">
<xsl:element name="DEL">
<xsl:value-of select='.'/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
应该正确地完成工作。
基本上,您需要单独处理atict:del
或atict:add
标记,然后才需要删除或保留,并且还要更改为<ADD>
或<DEL>
元素。< / p>
看到它在这里工作:http://xsltransform.net/3NSSEv2
答案 1 :(得分:0)
在网上搜索后,我相信这也可能是XSLT:
XSLT:
select m.*
from messages m
where m.id in (select max(m2.id)
from messages m2
where 50 in (m2.id_from, m2.id_to)
group by least(m2.id_from, m2.id_to), greatest(m2.id_from, m2.id_to)
);