如何从输出xml文件中删除重复的条目?

时间:2019-06-14 13:42:19

标签: xslt

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时,我也很厌倦,但是输出是相同的。下面是带有某些属性的输入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>

1 个答案:

答案 0 :(得分:0)

构建XML时,当前使用xsl:text和disable-output-escapeing的方法不是正确的方法。您应该直接写出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>