我需要一个xslt转换,该转换将转换一次应用生成的xml并发送到另一个要处理的应用程序。以下是一个示例源xml,其中包含数据字段名称及其相关数据,例如'current_date','item'..用于字段名称,以及'18 -OCT-2018','1044103'..用于数据值。
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<labels _JOBNAME="LBL1273711">
<label>
<variable name= "current_date">18-OCT-2018</variable>
<variable name= "item">1044103</variable>
<variable name= "item_description">RING,22-16 AWG,#4,RED,PB FREE</variable>
<variable name= "locator">INRE</variable>
</label>
</labels>
上面的xml转换为下面的xml:
<XMLScript Version="1.0">
<Command>
<Print JobName="LBL1273711">
<RecordSet Name="Text File 1" Type="btTextFile" AddIfNone="true">
<TextData><![CDATA[
current_date", "item", "item_description", "locator"
"18-OCT-2018", "1044103", "RING,22-16 AWG,#4,RED,PB FREE", "INRE"
]]></TextData>
</RecordSet>
</Print>
</Command>
</XMLScript>
数据字段名称,字段计数及其值会有所不同,并且从一个传入的xml更改为另一个。我在一个要求中使用下面的xslt,其中字段名称和字段计数是硬编码的。但是我需要对其进行更改,以转换变量/名称中提供的任意数量的字段计数和字段名称的源xml。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" cdata-section-elements="TextData"/>
<xsl:template match="/labels">
<XMLScript Version="1.0">
<Command>
<Print JobName="{@_JOBNAME}">
<RecordSet Name="Text File 1" Type="btTextFile" AddIfNone="true">
<TextData>
<xsl:value-of select="concat('
'
,'current_date','", "','item','", "',
'item_description','", "','locator','"
')" />
<xsl:for-each select="label">
<xsl:value-of select="concat('"',
variable[@name='current_date'],'", "',
variable[@name='item'],'", "',
variable[@name='item_description'],'", "',
variable[@name='locator'],'"
'
)" />
</xsl:for-each>
</TextData>
</RecordSet>
</Print>
</Command>
</XMLScript>
</xsl:template>
</xsl:stylesheet>
谢谢。
答案 0 :(得分:1)
如果您可以假设,对于给定的XML,每个access
下都有相同的label
元素,则可以执行此操作以输出标头。...
variable
同样,对于每个标签,执行此操作以输出值
<xsl:for-each select="label[1]/variable">
<xsl:if test="position() > 1">,</xsl:if>
<xsl:value-of select="concat('"', @name, '"')" />
</xsl:for-each>
尝试使用此XSLT
<xsl:for-each select="variable">
<xsl:if test="position() > 1">,</xsl:if>
<xsl:value-of select="concat('"', ., '"')" />
</xsl:for-each>
请注意,如果您可以使用XSLT 2.0,则可以将<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" cdata-section-elements="TextData"/>
<xsl:template match="/labels">
<XMLScript Version="1.0">
<Command>
<Print JobName="{@_JOBNAME}">
<RecordSet Name="Text File 1" Type="btTextFile" AddIfNone="true">
<TextData>
<xsl:for-each select="label[1]/variable">
<xsl:if test="position() > 1">,</xsl:if>
<xsl:value-of select="concat('"', @name, '"')" />
</xsl:for-each>
<xsl:text> </xsl:text>
<xsl:for-each select="label">
<xsl:for-each select="variable">
<xsl:if test="position() > 1">,</xsl:if>
<xsl:value-of select="concat('"', ., '"')" />
</xsl:for-each>
<xsl:text> </xsl:text>
</xsl:for-each>
</TextData>
</RecordSet>
</Print>
</Command>
</XMLScript>
</xsl:template>
</xsl:stylesheet>
替换为更简单的xsl:for-each
语句...
xsl:value-of