【问题标题】:Accept or reject change tracking in XML接受或拒绝 XML 中的更改跟踪
【发布时间】:2016-08-03 06:32:57
【问题描述】:

我有多个 XML 文件,其中包含更改跟踪属性 <atict:add><atict:del>

目标:

  • 如果 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>

<?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>

处理后输出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:add>1456790
</atict:add></PARA>

<?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:add>1456790
</atict:add></PARA>

如何在 XSLT 中添加带有 if 条件的 CT 以满足条件?

【问题讨论】:

  • adddel 的两个模板匹配。对::ancestor@CT="ACCEPT/REJECT" 进行测试以进一步匹配。
  • 谢谢乔普,喜欢这样吗?
  • 是的,虽然不完全是,但我想到了匹配 add 而不是 text(),当然还有 `test="::ancestor[@CT='ACCEPT']" 之类的, 最近没有做 XSLT - 顺便说一下,网上有很多关于 XSLT 的备忘单。

标签: xml xslt xsd xml-parsing xslt-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:stylesheet>

【讨论】:

  • 谢谢迈克尔。但是上面的 xsl 删除了 元素以及与之关联的值。
  • 我猜它没有检测到 CT
  • "上面的 xsl 删除了 元素以及与之关联的值" 这不就是它应该做的吗?如果没有,请编辑您的问题并澄清。
  • 非常感谢 Michael.. 上面的 xsl 非常有用!!
  • @ShravanVishwanathan 不需要添加任何东西;这就是它现在的行为方式。
【解决方案2】:

下面的示例样式表可以完成这项工作。有关说明,请参阅 cmets。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:atict="http://www.arbortext.com/namespace/atict"
    version="2.0">

    <xsl:strip-space elements="*"/>
    <xsl:output indent="yes"/>

    <xsl:variable name="CT_stat">
        <xsl:choose>
            <xsl:when test="DM/@CT = 'ACCEPT'">1</xsl:when>
            <xsl:when test="DM/@CT = 'REJECT'">0</xsl:when>
            <xsl:otherwise>2</xsl:otherwise>
        </xsl:choose>
    </xsl:variable>

    <!-- identity template  -->
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <!-- template matching for atict:del and atict:add, retaining
             them or deleting them based on $CT_stat variable -->    
    <xsl:template match="atict:del">
        <xsl:choose>
            <xsl:when test="$CT_stat=1"/>
            <xsl:when test="$CT_stat=0">
                <xsl:copy-of select="."/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:copy-of select="."/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template match="atict:add">
        <xsl:choose>
            <xsl:when test="$CT_stat=1">
                <xsl:copy-of select="."/>
            </xsl:when>
            <xsl:when test="$CT_stat=0"/>
            <xsl:otherwise>
                <xsl:copy-of select="."/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

【讨论】:

  • 感谢 xsl 乔尔。但是上面的 xsl 删除了 元素以及与之关联的值。我认为它没有检测到 CT="ACCEPT" 或 "REJECT" 以及 if 条件。
  • 抱歉以上评论乔尔。这个可以稍微修改一下!!
  • 我们能否在现有 XSL 中添加第三个条件。如果 CT='"" 则同时接受 ?
  • 我已经修改了我的答案。如果 CT 既不是 ACCEPT 也不是 REJECT,它接受两者。
  • 非常感谢乔尔。非常感谢。!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-14
  • 1970-01-01
  • 2022-10-02
  • 1970-01-01
  • 2011-11-01
  • 1970-01-01
  • 2014-07-28
相关资源
最近更新 更多