【问题标题】:Remove element in XML on condition根据条件删除 XML 中的元素
【发布时间】:2016-11-17 13:20:58
【问题描述】:

我有多个 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,我得到了元素标签。处理后我只需要相应标签内的值。

【问题讨论】:

    标签: xml xslt


    【解决方案1】:

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

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

    再定义两个模板:

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

    根据模板的内部优先级,xslt 处理器要么采用“删除”模板,要么采用(新的)“仅内容”模板。

    【讨论】:

      猜你喜欢
      • 2020-12-13
      • 1970-01-01
      • 2011-11-29
      • 2018-10-12
      • 2017-08-31
      • 1970-01-01
      • 2013-04-06
      • 1970-01-01
      相关资源
      最近更新 更多