时间:2016-11-17 13:20:59

标签: xml xslt

我有多个XML文件,其中包含更改跟踪属性或。

目标:

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

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>

处理后所需的输出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 1456790 </PARA>
</DM>

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:del[ancestor::DM/@CT='ACCEPT']"/>
  <xsl:template match="atict:add[ancestor::DM/@CT='REJECT']"/>
</xsl:stylesheet>

使用我的XSLT,我得到了元素标签。处理后我只需要相应标签内的值。

1 个答案:

答案 0 :(得分:1)

  

处理后我只需要相应标签内的值。

因为您的身份转换模板会再次复制该元素。

自己定义两个进一步的!模板:

<xsl:template match="atict:del">
    <xsl:apply-templates/>
</xsl:template>
<xsl:template match="atict:add">
    <xsl:apply-templates/>
</xsl:template>

根据模板的内部优先级,xslt处理器可以使用&#34;删除&#34; -templates或(新的)&#34;仅限内容&#34; -templates。