2016-11-06 108 views
0

我有一个包含更改跟踪的XML。用条件更改XML中的跟踪

目标:如果XML文件包含元素CT="ACCEPT",则接受/打印所有使用<atict:add>的标签并忽略<atict:del>。如果XML文件使用元素CT="REJECT",则接受/打印所有使用<atict:del>的标签并忽略<atict:accept>

但是,万一XML不包含任何CT元素,则其应该相应地(无论<atict:add><atict:del>存在。

我能够实现这个问题的第一部分,但不能插入ADDDEL元素第二部分

示例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中存在CT=ACCEPTCT=REJECT元素时,我不需要ADD,DEL元素。

如果可能的话,你能帮我解决一下吗?

感谢您的帮助。

回答

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> 

应该做好这方面的工作。

基本上你需要时则需要被移除或保存,并且也变更为<ADD><DEL>元件单独地处理所述atict:delatict:add标签。

看到它的工作住在这里:http://xsltransform.net/3NSSEv2

+0

谢谢。有用! –

0

在网上搜索后,我认为这也可能是XSLT:

XSLT:

<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:add[not(ancestor::DM/@CT='ACCEPT')]" > 
<xsl:element name="ADD"> 
<xsl:value-of select='.'/> 
</xsl:element> 
</xsl:template> 
<xsl:template match="atict:del[not(ancestor::DM/@CT='REJECT')]"> 
<xsl:element name="DEL"> 
<xsl:value-of select='.'/> 
</xsl:element> 
</xsl:template> 
<xsl:template match="atict:del[ancestor::DM/@CT='ACCEPT']"/> 
<xsl:template match="atict:add[ancestor::DM/@CT='REJECT']"/> 
</xsl:stylesheet>