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>
</xsl:text><xsl:text disable-output-escaping="yes"><</xsl:text><xsl:text>obj</xsl:text><xsl:text disable-output-escaping="yes">></xsl:text><xsl:text>
</xsl:text>
<xsl:text disable-output-escaping="yes"><</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">"/></xsl:text><xsl:text>
</xsl:text>
<xsl:text disable-output-escaping="yes"><</xsl:text><xsl:text>/obj</xsl:text><xsl:text disable-output-escaping="yes">></xsl:text><xsl:text>
</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>
答案 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>