使用条件

时间:2016-11-06 11:53:47

标签: xml xslt

我有一个带变更跟踪的XML。

目标:如果XML文件由元素CT="ACCEPT"组成,则使用<atict:add>接受/打印所有标记并忽略<atict:del>。 -if XML文件由元素CT="REJECT"组成,然后使用<atict:del>接受/打印所有标记并忽略<atict:accept>

但是,如果XML不包含任何CT元素,那么它应该相应地插入ADDDEL元素(只有<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中存在ADDDEL元素时,我不需要CT=ACCEPTCT=REJECT元素。

如果可能的话,请你帮我一个条件。

感谢您的帮助。

2 个答案:

答案 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:delatict: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)
              );