【问题标题】:how to remove duplicate entries from the output xml file?如何从输出 xml 文件中删除重复条目?
【发布时间】:2019-06-14 13:42:19
【问题描述】:

XSL 样式表正在生成重复输出。下面是一个例子。同样的事情重复三次。在第一组 xml 中,我只获取第一个属性的值,第二个属性的值,依此类推。

    <?xml version="1.0" encoding="UTF-8"?>

    <obj>
    <desc value="113662176"/>
    <index value="" name="MATERIALNUMMER"/>
    <index value="" name="DOKUMENTENART"/>
    </obj>

    <obj>
    <desc value=""/>
    <index value="66260383180" name="MATERIALNUMMER"/>
    <index value="" name="DOKUMENTENART"/>
    </obj>

    <obj>
    <desc value=""/>
    <index value="" name="MATERIALNUMMER"/>
    <index value="Fertigungsauftrag" name="DOKUMENTENART"/>
    </obj>

我也厌倦了 xsl when and choose 但输出是一样的。下面是一个带有一些属性的示例输入 xml。

    <?xml version = "1.0" encoding = "utf-8"?>
    <root>
    <document> 
    <field   level = "document" name = "Fertigungsauftragsnummer" value = "113662176"/>
    <field   level = "document" name = "Materialnummer" value = "66260383180"/>
    <field   level = "document" name = "Dokumentenart" value = "Fertigungsauftrag"/>
    </document> 
    </root>

下面是我用于转换的 xsl 样式表。在 xsl 模板中,如果我使用 match="/*" 我不会得到重复的输出,我也不会得到 xml 属性的值。如果我们有一个特定的输出,似乎对于每个 xsl。如何使 xsl 样式表只编译一次所有 xsl if 语句的输入 xml?

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:transform version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/root/document/*">
    <xsl:text>&#xa;</xsl:text><xsl:text disable-output-escaping="yes">&lt;</xsl:text><xsl:text>obj</xsl:text><xsl:text disable-output-escaping="yes">&gt;</xsl:text><xsl:text>&#xa;</xsl:text>
    <xsl:text disable-output-escaping="yes">&lt;</xsl:text><xsl:text>desc value="</xsl:text>
     <xsl:if test="@name='Fertigungsauftragsnummer'">   
     <xsl:value-of select="@value" />
     <xsl:if test="@name='Materialnummer'"> 
     <xsl:value-of select="@value" />
     <xsl:if test="@name='Dokumentenart'">  
     <xsl:value-of select="@value" />
     </xsl:if>
     </xsl:if>
     </xsl:if>
    <xsl:text disable-output-escaping="yes">"/&gt;</xsl:text><xsl:text>&#xa;</xsl:text>
     <xsl:text disable-output-escaping="yes">&lt;</xsl:text><xsl:text>/obj</xsl:text><xsl:text disable-output-escaping="yes">&gt;</xsl:text><xsl:text>&#xa;</xsl:text>
     </xsl:template>
    </xsl:transform>

预期输出如下所示

    <?xml version="1.0" encoding="UTF-8"?>
    <obj>
    <desc value="113662176"/>
    <index value="66260383180" name="MATERIALNUMMER"/>
    <index value="Fertigungsauftrag" name="DOKUMENTENART"/>
    </obj>

【问题讨论】:

    标签: xslt


    【解决方案1】:

    在构建 XML 时,您当前使用 xsl:text 和 disable-output-escaping 的方法不是正确的方法。您应该直接写出 XML 标记。看起来您想将 document 元素转换为 obj 元素,因此您应该有这样的模板

    <xsl:template match="/root/document">
      <obj>
        <xsl:apply-templates select="field" />
      </obj>
    </xsl:template>
    

    (在您当前的 XSLT 中,您将 field 转换为 obj,这就是您得到三个的原因。

    您还希望将名称为“Fertigungsauftragsnummer”的字段放入desc 元素中,因此只需为此创建一个模板。

    <xsl:template match="field[@name='Fertigungsauftragsnummer']">
      <desc value="{@value}"/>
    </xsl:template>
    

    注意使用花括号的属性的语法。这些被称为Attribute Value Templates

    对于其他两个字段,您可以共享一个通用模板,因为看起来您只想在两种情况下都将名称设为大写

    <xsl:template match="field">
      <index value="{@value}" name="{translate(@name, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')}"/>
    </xsl:template>
    

    试试这个 XSLT

    <xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
      <xsl:output method="xml" indent="yes" />
    
      <xsl:template match="/root/document">
        <obj>
          <xsl:apply-templates select="field" />
        </obj>
      </xsl:template>
    
      <xsl:template match="field[@name='Fertigungsauftragsnummer']">
        <desc value="{@value}"/>
      </xsl:template>
    
      <xsl:template match="field">
        <index value="{@value}" name="{translate(@name, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')}"/>
      </xsl:template>
    </xsl:stylesheet>
    

    【讨论】:

    • 嗨蒂姆,非常感谢您的回答。它在某种程度上帮助了我很多。您在这里定义了两个模板,有没有办法区分这两个模板,因为我必须在 3 个不同的标签中添加相同的值。例如:
    • 嗨,蒂姆,在 mode 的帮助下,我实现了我想要的。非常感谢您的支持。问候,Amrita
    猜你喜欢
    • 1970-01-01
    • 2015-03-12
    • 2023-04-06
    • 1970-01-01
    • 2015-07-09
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多